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>
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:
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¶
Repository Audit¶
curl -u "<username>:<password>" \
"https://save.example.com/api/v1/admin/audit?resource_type=repository&q=maven-central-proxy&limit=50"