Skip to content

Working with Maven

CodeScoring.Save supports Maven 2 layout and is compatible with JVM tools that use it: mvn, gradle, ant + Ivy / maven-ant-tasks, sbt, and others.

Proxy Repository

curl -X POST https://save.example.com/api/v1/repos \
  -H "Content-Type: application/json" \
  -u "<username>:<password>" \
  -d '{
    "project": "backend",
    "name": "maven-central-proxy",
    "format": "maven",
    "repository_type": "proxy",
    "remote_url": "https://repo1.maven.org/maven2/"
  }'

Hosted Repository

curl -X POST https://save.example.com/api/v1/repos \
  -H "Content-Type: application/json" \
  -u "<username>:<password>" \
  -d '{
    "project": "backend",
    "name": "internal-maven",
    "format": "maven",
    "repository_type": "hosted"
  }'

Client Configuration

mvn

In ~/.m2/settings.xml:

<settings>
  <mirrors>
    <mirror>
      <id>save-maven</id>
      <name>CodeScoring Save Maven</name>
      <url>https://save.example.com/maven/<project>/maven-central-proxy/</url>
      <mirrorOf>central</mirrorOf>
    </mirror>
  </mirrors>

  <servers>
    <server>
      <id>save-maven</id>
      <username><username></username>
      <password><password></password>
    </server>
  </servers>
</settings>

To publish artifacts (deploy to hosted), add this to pom.xml:

<distributionManagement>
  <repository>
    <id>save-maven</id>
    <url>https://save.example.com/maven/<project>/internal-maven/</url>
  </repository>
</distributionManagement>
mvn deploy

gradle

In build.gradle:

repositories {
    maven {
        url 'https://save.example.com/maven/<project>/maven-central-proxy/'
        credentials {
            username = project.findProperty('saveUser') ?: System.getenv('SAVE_USER')
            password = project.findProperty('savePassword') ?: System.getenv('SAVE_PASSWORD')
        }
    }
}

publishing {
    repositories {
        maven {
            name = 'codescoring-save'
            url = 'https://save.example.com/maven/<project>/internal-maven/'
            credentials {
                username = project.findProperty('saveUser') ?: System.getenv('SAVE_USER')
                password = project.findProperty('savePassword') ?: System.getenv('SAVE_PASSWORD')
            }
        }
    }
}

Or in Kotlin DSL (build.gradle.kts):

repositories {
    maven {
        url = uri("https://save.example.com/maven/<project>/maven-central-proxy/")
        credentials {
            username = (findProperty("saveUser") ?: System.getenv("SAVE_USER")) as String
            password = (findProperty("savePassword") ?: System.getenv("SAVE_PASSWORD")) as String
        }
    }
}

Credentials can be stored in ~/.gradle/gradle.properties:

saveUser=<username>
savePassword=<password>

Robot accounts in CI

For CI/CD, use a robot account: username = sa$<robot-name>, password = <api-key>. The structure of settings.xml and gradle.properties remains the same; only values change. For details, see Authentication.

ant

Option 1: through maven-ant-tasks:

<project xmlns:artifact="urn:maven-artifact-ant">
  <typedef resource="org/apache/maven/artifact/ant/antlib.xml"
           uri="urn:maven-artifact-ant"
           classpathref="maven-ant-tasks.classpath" />

  <artifact:remoteRepository id="codescoring"
                              url="https://save.example.com/maven/<project>/maven-central-proxy/">
    <authentication username="<username>" password="<password>" />
  </artifact:remoteRepository>

  <artifact:dependencies pathId="dependency.classpath">
    <remoteRepository refid="codescoring" />
    <dependency groupId="org.apache.commons" artifactId="commons-lang3" version="3.12.0" />
  </artifact:dependencies>
</project>

Option 2: through Apache Ivy with ivysettings.xml:

<ivysettings>
  <settings defaultResolver="codescoring" />
  <credentials host="save.example.com"
               realm="Sonatype Nexus Repository Manager"
               username="<username>"
               passwd="<password>" />
  <resolvers>
    <ibiblio name="codescoring"
             m2compatible="true"
             root="https://save.example.com/maven/<project>/maven-central-proxy/" />
  </resolvers>
</ivysettings>

sbt

In ~/.sbt/1.0/global.sbt:

resolvers += "codescoring" at "https://save.example.com/maven/<project>/maven-central-proxy/"
credentials += Credentials(
  "CodeScoring Save",
  "save.example.com",
  sys.env.getOrElse("SAVE_USER", ""),
  sys.env.getOrElse("SAVE_PASSWORD", "")
)

Repository URL Migration

Use case: migrating a Maven repository from Nexus / Artifactory to CodeScoring.Save.

Source URL in settings.xml before migration URL in settings.xml after migration
Nexus https://nexus.host.ru/repository/maven-remote https://save.example.com/maven/<project>/maven-central-proxy/
Artifactory https://jfrog.host.ru/artifactory/maven-remote https://save.example.com/maven/<project>/maven-central-proxy/
Official repository https://repo.maven.apache.org/maven2 https://save.example.com/maven/<project>/maven-central-proxy/

Authentication parameters (username, password) and the <servers> block are transferred unchanged.

Troubleshooting

Checking Package Metadata

curl -u "<username>:<password>" \
  https://save.example.com/maven/<project>/maven-central-proxy/org/apache/commons/commons-lang3/maven-metadata.xml

Service Status

curl https://save.example.com/health

Repository Audit

curl -u "<username>:<password>" \
  "https://save.example.com/api/v1/admin/audit?resource_type=repository&q=maven-central-proxy&limit=50"
Страница была полезна?