JFrog Artifactory and Oracle repository - java

I've started to use JFrog Artifactory 4.14, my maven app needs an ojdbc jar which can be downloaded from oracle repository, which, if I use maven local settings, I'd setted from
http://docs.oracle.com/middleware/1213/core/MAVEN/config_maven_repo.htm#MAVEN9010
Now, using JFrog Artifactory, I've setted remote repo according to
http://buttso.blogspot.lt/2015/02/fronting-oracle-maven-repository-with.html https://www.jfrog.com/blog/fronting-oracle-maven-repository-artifactory/
TEST button says connection successful
I've replaced settings.xml file with the one JFrog Artifactory generated to me
<?xml version="1.0" encoding="UTF-8"?>
<settings xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd" xmlns="http://maven.apache.org/SETTINGS/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<servers>
<server>
<username>${security.getCurrentUsername()}</username>
<password>${security.getEscapedEncryptedPassword()!"*** Insert encrypted password here ***"}</password>
<id>central</id>
</server>
<server>
<username>${security.getCurrentUsername()}</username>
<password>${security.getEscapedEncryptedPassword()!"*** Insert encrypted password here ***"}</password>
<id>snapshots</id>
</server>
</servers>
<mirrors>
<mirror>
<mirrorOf>*</mirrorOf>
<name>remote-repos</name>
<url>http://docker.k***.l**:8081/artifactory/remote-repos</url>
<id>remote-repos</id>
</mirror>
</mirrors>
<profiles>
<profile>
<repositories>
<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>libs-release</name>
<url>http://docker.k***.l**:8081/artifactory/libs-release</url>
</repository>
<repository>
<snapshots />
<id>snapshots</id>
<name>libs-snapshot</name>
<url>http://docker.k***.l**:8081/artifactory/libs-snapshot</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>plugins-release</name>
<url>http://docker.k***.l**:8081/artifactory/plugins-release</url>
</pluginRepository>
<pluginRepository>
<snapshots />
<id>snapshots</id>
<name>plugins-snapshot</name>
<url>http://docker.k***.l**:8081/artifactory/plugins-snapshot</url>
</pluginRepository>
</pluginRepositories>
<id>artifactory</id>
</profile>
</profiles>
<activeProfiles>
<activeProfile>artifactory</activeProfile>
</activeProfiles>
</settings>
I've added to my POM
<distributionManagement>
<repository>
<id>central</id>
<name>e44b4c0db643-releases</name>
<url>http://docker.k***.l**:8081/artifactory/ext-release-local</url>
</repository>
</distributionManagement>
but when I try to run maven command
clean install
I get
The following artifacts could not be resolved: com.oracle.jdbc:ojdbc7:jar:12.1.0.2, com.oracle.jdbc:ucp:jar:12.1.0.2: Could not find artifact com.oracle.jdbc:ojdbc7:jar:12.1.0.2 in remote-repos

You need to define a virtual repository in JFrog. This will be a combination of other repositoies, this is the one you will point at in your settings.xml.
See https://www.jfrog.com/confluence/display/RTF/Virtual+Repositories
I suspect you will also need a proxy element in your settings.xml.
See https://maven.apache.org/guides/mini/guide-proxies.html

As You already have created You new Remote Repository You have to add it to Virtual Repository
choose New (or edit existing one)
and select repositories
that should be it

Related

How do I force Maven to use external repos to retrieve artifacts?

I got following error while trying to build the project. The project is spring project and use IntelliJ with java 8.
Could not find artifact org.springframework.data:spring-data-bom:pom:2021.0.0-M2 in nexus (http://maven:8081/nexus/content/groups/public)
Is there a way to fix it through setting.xml?
I have not access to any configuration on http://maven:8081/nexus/content/groups/public
This is my setting.
<settings
xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<servers>
<server>
<id>releases</id>
<username>me</username>
<password>mee</password> <!-- impossible password here :-) -->
</server>
<server>
<id>snapshots</id>
<username>me</username>
<password>mee</password> <!-- impossible password here :-) -->
</server>
<server>
<id>nexus</id>
<username>me</username>
<password>mee</password> <!-- impossible password here :-) -->
</server>
</servers>
<mirrors>
<mirror>
<!--This sends everything else to /public -->
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://maven:8081/nexus/content/groups/public</url>
</mirror>
</mirrors>
<profiles>
<profile>
<id>nexus</id>
<!--Enable snapshots for the built in central repo to direct -->
<!--all requests to nexus via the mirror -->
<repositories>
<repository>
<id>central</id>
<url>https://mvnrepository.com/repos/central</url>
<releases><enabled>true</enabled><updatePolicy>always</updatePolicy></releases>
<snapshots><enabled>true</enabled><updatePolicy>always</updatePolicy></snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<url>https://mvnrepository.com/repos/central</url>
<releases><enabled>true</enabled><updatePolicy>always</updatePolicy></releases>
<snapshots><enabled>true</enabled><updatePolicy>always</updatePolicy></snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
<profile>
<id>defaultprofile</id>
<!-- if you want to be able to switch to the defaultprofile profile put this in the active profile -->
<repositories>
<repository>
<id>maven.default</id>
<name>default maven repository</name>
<url>http://repo1.maven.org/maven2</url>
<releases><enabled>true</enabled><updatePolicy>always</updatePolicy></releases>
<snapshots><enabled>true</enabled><updatePolicy>always</updatePolicy></snapshots>
</repository>
<repository>
<id>maven.snapshot</id>
<name>Maven snapshot repository</name>
<releases><enabled>true</enabled><updatePolicy>always</updatePolicy></releases>
<url>http://people.apache.org/repo/m2-snapshot-repository</url>
<snapshots><enabled>true</enabled><updatePolicy>always</updatePolicy></snapshots>
</repository>
<repository>
<id>vaadin-addons</id>
<url>https://maven.vaadin.com/vaadin-addons</url>
</repository>
</repositories>
</profile>
</profiles>
<activeProfiles>
<!--make the profile active all the time -->
<activeProfile>nexus</activeProfile>
</activeProfiles>
If you set
<mirrorOf>*</mirrorOf>
<url>http://maven:8081/nexus/content/groups/public</url>
then you send every request to this repository, regardless of the rest of the settings.xml. You need to do something like
<mirrorOf>*,!central</mirrorOf>
<url>http://maven:8081/nexus/content/groups/public</url>
but please also correct/remove the URLs as khmarbaise said.

Maven failing to download artifact from central repository

I have two private JFrog repositories setup. One repository handles releases and the other handles snapshots. Here is how I have defined this in my settings.xml file.
<settings>
<activeProfiles>
<activeProfile>default</activeProfile>
</activeProfiles>
<servers>
<server>
<id>central</id>
<username>private-repo-username</username>
<password>private-repo-password</password>
</server>
<server>
<id>snapshots</id>
<username>private-repo-username</username>
<password>private-repo-password</password>
</server>
</servers>
<profiles>
<profile>
<id>default</id>
<repositories>
<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>a0d2olsx0t222-artifactory-primary-0-releases</name>
<url>https://my-private-repo.jfrog.io/artifactory/libs-release</url>
</repository>
<repository>
<id>snapshots</id>
<name>a0d2olsx0t222-artifactory-primary-0-snapshots</name>
<url>https://my-private-repo.jfrog.io/artifactory/libs-snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>
</settings>
Multiple of my internal dependencies in my multi-module maven project are getting this error:
[ERROR] Failed to execute goal on project platform-utils: Could not resolve dependencies for project
design.colspalinva:platform-utils:jar:2.2.1-SNAPSHOT: The following artifacts could not be resolved:
com.maxmind.geoip2:geoip2:jar:2.12.0, org.apache.ant:ant:jar:1.10.5: Could not find artifact
com.maxmind.geoip2:geoip2:jar:2.12.0 in central (https://my-private-repo.jfrog.io/artifactory/libs-
release) -> [Help 1]
From the look of it, it doesn't appear that Maven is trying to reach out to the official Maven Central repo for those dependencies, rather failing on my private repository. I was under the impression that if the private repository does not contain the specific artifact, it will attempt to reach out to Maven Central.
It has no problem downloading my Spring dependencies from Maven Central.
If you like to redirect all access of central from Maven to your own repository manager you have to configure the settings.xml as follows:
<! language:language-xml ->
<?xml version="1.0" encoding="UTF-8"?>
<settings
xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
https://maven.apache.org/xsd/settings-1.0.0.xsd">
<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://IP:PORT/repository/repo</url>
</mirror>
</mirrors>
<profiles>
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>central</id>
<url>http://central</url>
<releases>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<url>http://central</url>
<releases>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<!--make the profile active all the time -->
<activeProfile>nexus</activeProfile>
</activeProfiles>
</settings>
The Maven settings.xml configuration you shared seems to be OK. You are overriding the built-in central and snapshot repositories of Maven, which is the correct way to make sure that Maven send requests by default to Artifactory.
Adding a Mirror Any setting, as suggested in the other answer, means that in addition to overriding built-in Maven repositories, you can use the Mirror Any setting to redirect all requests to a Maven repository through Artifactory, including those defined inside POMs of plug-ins and third party dependencies.
According to the log you shared Maven does attempt to resolve the artifacts via Artifactory - https://my-private-repo.jfrog.io/artifactory/libs-release
The issue seems to be related to resolution of a specific artifact(s)in Artifactory.
I'm assuming that libs-release is a virtual Maven repository and that it contains at least one remote Maven repository pointing at Jcenter or Maven Central (if not please start by looking at Maven Repositories).
To debug the issue:
(1) Try resolving the artifact directly from Artifactory using cURL or a web browser, for example:
curl -Uuser:pass https://my-private-repo.jfrog.io/artifactory/libs-release/com/maxmind/geoip2/geoip2/2.12.0/geoip2-2.12.0.jar
(2) If you manage to resolve the artifact, it mean that Artifactory is properly configured and Maven should be able to resolve. If not, try looking for the reason performing a trace, for example:
curl -Uuser:pass https://my-private-repo.jfrog.io/artifactory/libs-release/com/maxmind/geoip2/geoip2/2.12.0/geoip2-2.12.0.jar?trace

Maven failing to build when not connected to company VPN / private repository?

With a lot of people working from home currently and using VPNs, I am having an issue with building on maven for personal projects that don't use work related artefacts.
Which results in me always needing to be connected to the VPN.
For example if I create a new spring boot application, it requires me to be on the VPN otherwise it won't be able to build properly, with an error like this:
Failed to read artifact descriptor for
com.hubspot.slack:slack-base:jar:1.8: Could not transfer artifact
com.hubspot.slack:slack-base:pom:1.8 from/to at-repository
(https://foobar.jfrog.io/foobar/public): Access denied to:
https://foobar.jfrog.io/foobar/public/com/hubspot/slack/slack-base/1.8/slack-base-1.8.pom
Is there a way for me to configure maven to try and build without the need for my company repository?
Or can I have multiple configs and a way to switch between them?
I understand it should fail for foocompany specific artefacts but not everything else.
This is the config.xml (redacted name)
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<mirrors>
<mirror>
<id>foo-repository</id>
<url>https://foo.jfrog.io/foo/public</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
<servers>
<server>
<id>foo-repository</id>
<username>deployment</username>
<password>xxx</password>
</server>
<server>
<id>snapshots</id>
<username>deployment</username>
<password>xxx</password>
</server>
<server>
<id>releases</id>
<username>deployment</username>
<password>xxx</password>
</server>
</servers>
<profiles>
<profile>
<id>default</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>foo-repository</id>
<url>This has to be populated but the URL will be taken from the mirror.</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>foo-repository</id>
<url>This has to be populated but the URL will be taken from the mirror.</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
</settings>
Essentially it was a case of disabling the user maven config like so and using a bash alias to make it easier
#turn off default settings
mv ~/.m2/settings.xml ~/.m2/settings.xml.off
#turn on again
mv ~/.m2/settings.xml.off ~/.m2/settings.xml
More info on my workaround can be seen here:
https://tomaytotomato.com/maven-whilst-working-from-home/

Maven project with local file dependency build error 501

I've got maven project with local dependencies, which doesn't compile because this 'improvement', introduced by maven:
Effective January 15, 2020, The Central Repository no longer supports
insecure communication over plain HTTP and requires that all requests
to the repository are encrypted over HTTPS.
Here is my pom.xml:
...
<repositories>
<repository>
<id>in-project</id>
<name>In Project Repo</name>
<url>file://${project.basedir}/libs</url>
</repository>
</repositories>
...
So now I'm receiving the following compile error:
Could not resolve dependencies for project ........:war:1.0: Failed to
collect dependencies for [.........:jar:1.0 (compile),
javax:javaee-web-api:jar:7.0 (provided), .........:jar:1.0
(compile)]: Failed to read artifact descriptor for
.........:jar:1.0: Could not transfer artifact
.........:pom:1.0 from/to central
(http://repo.maven.apache.org/maven2): Failed to transfer file:
http://repo.maven.apache.org/maven2/com/..../..../1.0/.....-1.0.pom.
Return code is: 501 , ReasonPhrase:HTTPS Required. -> [Help 1]
As you can see I'm using local jar file, but this doesn't compile anymore
Does anyone have idea how to configure local repository for successful compilation?
The Maven server do not support HTTP anymore. You must configure the maven repositories with HTTPS url's in your local maven configuration file, in your home folder yourname/.m2/settings.xml.
Here is an example that you may copy:
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd">
<profiles>
<profile>
<id>artifactory</id>
<repositories>
<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>libs-release</name>
<url>https://repo1.maven.org/maven2/</url>
</repository>
<repository>
<snapshots />
<id>snapshots</id>
<name>libs-snapshot</name>
<url>https://repo1.maven.org/maven2/</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>plugins-release</name>
<url>https://repo1.maven.org/maven2/</url>
</pluginRepository>
<pluginRepository>
<snapshots />
<id>snapshots</id>
<name>plugins-snapshot</name>
<url>https://repo1.maven.org/maven2/</url>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>artifactory</activeProfile>
</activeProfiles>
</settings>

Jenkins Config File Maven Multiple Nexus Repositories Download

So I want to setup a config file in Jenkins for a Maven project to use multiple repositories. The whole idea is to try and download from one if it cannot be found then download from the second one. Below is what I have configured now and from the Jenkins logs, I can see it 'downloading' from both repositories.
The problem is that it doesn't actually fallback if it can't find it in the first one it simply fails so something is wrong. I have to add that everything works fine if I use either of them exclusively so it's not a connectivity issue are anything else like that. Please help I have been at this for a day and a half now and I am fairly sure it's because I can't wrap my mind around the Maven Documentation.
[INFO] Downloading: https:NEW_NEXUS/artifact/1.15.0-SNAPSHOT/maven-metadata.xml
[INFO] Downloading: http:OLD_NEXUS/artifact/1.15.0-SNAPSHOT/maven-metadata.xml
[INFO]
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<mirrors>
<mirror>
<id>new-nexus</id>
<mirrorOf>*</mirrorOf>
<name>New Nexus Repository</name>
<url>NEW_NEXUS/nexus/repository/maven-public/</url>
</mirror>
<mirror>
<id>old-nexus</id>
<mirrorOf>old-nexus</mirrorOf>
<name>Old Nexus Repository</name>
<url>OLD_NEXUS/nexus/content/groups/public/</url>
</mirror>
</mirrors>
<profiles>
<profile>
<id>new-nexus</id>
<repositories>
<repository>
<id>central</id>
<url>http://central</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>old-nexus</id>
<name>Old Nexus Repository</name>
<url>OLD_NEXUS/nexus/content/groups/public/</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<url>http://central</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>new-nexus</activeProfile>
</activeProfiles>
</settings>
By using
<mirrorOf>*</mirrorOf>
you set the repository as mirror of everything, so every request is redirected to the NEW_NEXUS/nexus/repository/maven-public repository.
What you usually do:
Go into the Nexus as administrator and define a repository group which contains both repositories. Then just use this repository group as mirror of everything. The Nexus repository group behaves as you expect: It goes through all the repositories until it finds the requested artifact.

Categories

Resources