Maven repository lookup order - maven

We have an internal Apache Archiva based repository and we have configured the repositories tag in pom.xml to be as follows. Can I assume that all dependency access will get resolved by internal repository if you have access to it and will get resolved by other repositories listed below, if internal repository is down for a certain reason.
<repositories>
<repository>
<id>internal</id>
<name>Internal Repository</name>
<url>http://192.168.1.2/archiva/repository/internal</url>
</repository>
<repository>
<id>jboss</id>
<url>https://repository.jboss.org/nexus/content/repositories/releases</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
....
</repositories>
EDIT:
I want to do away with the .m2/settings.xml file. I want to define this in my pom.xml file, so that if my repository manager is UP and running I would want the runtime to connect there, else would want to fallback into the other repositories. Would this be possible?

Maven 3.0 had it fixed as you can see in Maven developer's Jira below. The lookup will be done in the order they are declared.
https://issues.apache.org/jira/browse/MNG-4400

Related

How maven handle multiple <repository> configurations?

I am getting more and more comfortable with maven. But still some questions.
I have multiple <repository> in my pom.xml.
How will maven handle these repos when downloading artifacts? Will it search by the declaration order?
Besides the explicitly declared ones, will maven still check the default central repo at http://repo.maven.apache.org/maven2/?
If something cannot be found within the explicitly configured repo, will maven fallback to the default central repo?
Is it good to use multiple repos? I am kind of worried about inconsistency.
Below is the <repositories> section of my pom.xml:
<repositories>
<repository>
<id>ibiblio-central-repo</id>
<layout>default</layout>
<name>ibiblio-central-repo</name>
<releases>
<checksumPolicy>warn</checksumPolicy>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<url>http://maven.ibiblio.org/maven2/</url>
</repository>
<repository>
<id>oschina-central-repo</id>
<layout>default</layout>
<name>oschina-central-repo</name>
<releases>
<checksumPolicy>warn</checksumPolicy>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<url>http://maven.oschina.net/content/groups/public/</url>
</repository>
<repository>
<id>oschina-central-repo-3rd-party</id>
<layout>default</layout>
<name>oschina-central-repo-3rd-party</name>
<releases>
<checksumPolicy>warn</checksumPolicy>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<url>http://maven.oschina.net/content/repositories/thirdparty/</url>
</repository>
</repositories>
How will maven handle these repos when downloading artifacts? Will it
search by the declaration order?
Order of declaration as part of the merged settings (see next answer). I have found this JIRA ticket providing further details.
Besides the explicitly declared ones, will maven still check the
default central repo at http://repo.maven.apache.org/maven2/?
Yes, as it will be provided by the Maven super POM, implicit parent of all Maven Pom (here an official example), unless specified in your settings.xml (if you override the repository id specified in the super POM). You can use the Maven Help Plugin to get the effective settings Maven will apply to your build and the effective pom maven will actually (effectively) run.
As documented here, the repositories element is inherited.
If something cannot be found within the explicitly configured repo,
will maven fallback to the default central repo?
As above. Moreover, you could also influence this mechanism via any configured Maven mirror. You could, for instance, redirect Maven to your company repository (see below) instead of looking up on the default one.
Is it good to use multiple repos? I am kind of worried about
inconsistency.
You probably don't need many configured repositories, but you might need more than one if the dependencies you are looking for are not provided by the default repository. A good approach would be to have an enterprise Maven repository (i.e. Artifactory, Nexus) and make your local settings only point to it. Then, configure the internal Maven repository to point to other repositories, in a centralized (and governed) manner.

unable to download maven repositories due to custom settings.xml?

Here is my situation:
I am able to run mvn install on my personal computer and the build successful.
But when I run the same at workstation, I get the following error. This is most likely because I have a settings.xml in ${user.home}/.m2/settings.xml which refers to my company's repo and DOES NOT allow to fetch from remote maven repo. How can I overcome this behavior?
Both my workstation and personal computer runs mac OS X.
Here is the settings.xml(I have replaced real names with dummy ones)
<profiles>
<profile>
<id>dummy</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<dummy-groupId>com.mycompany.mydummy</dummy-groupId>
<dummy-name>my-java-ee-app</dummy-name>
<dummy-Mode>FALSE</dummy-Mode>
</properties>
<repositories>
<repository>
<id>mycompany Release Repository</id>
<name>central maven release repository</name>
<url>
http://maven1.mycompany.com:8080/myartifactories/repo
</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>mycompany Snapshot Repository</id>
<name>central maven snapshot repository</name>
<url>
http://maven1.mycompany.com:8080/myartifactories/repo
</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>mycompany Release Plugin Repository</id>
<name>central maven release repository</name>
<url>
http://maven1.mycompany.com:8080/myartifactories/repo
</url>
<releases>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
</releases>
</pluginRepository>
<pluginRepository>
<id>mycompany Snapshot Plugin Repository</id>
<name>maven snapshot repository</name>
<url>
http://maven1.mycompany.com:8080/myartifactories/repo
</url>
<snapshots>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
Error:
Could not resolve dependencies for project org.glassfish.javaeetutorial:roster-ejb:ejb:7.0.5: Failure to find org.glassfish.javaeetutorial:roster-common:jar:7.0.5 in http://maven1.mycompany.com:8080/myartifactories/repo was cached in the local repository, resolution will not be reattempted until the update interval of mycompany Release Repository has elapsed or updates are forced -> [Help 1]
EDIT:
I DO see the central repo in my effective pom:
Here is the condensed version of it
<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>Central Repository</name>
<url>http://repo.maven.apache.org/maven2</url>
</repository>
Simplest solution is to configure a repository manager on your mac and configure the different repositories in the repository manager. Or you can use git to switch your ${HOME}/.m2/settings.xml to different state.
Update:
Create a git repository in ${HOME}/.m2/ via git init there
add an appropriate .gitignore file which contains a single line
repository. Checkin your settings.xml file. Create a branch
for example git co -b company make the appropriate changes for
your company and check in that state. Afterwards you can simply
switch by changing into the appropriate branch in git.
Setup Repository manager like Nexus (on your machine)
and configure there necessary repositories you need. If you working
on company site you can activate/deactivate the appropriate repository
via the UI of Nexus which means you have no change in your
settings.xml.
My preference is the local git repository which make life easier for me as well.
It seems your repo is cached locally and needs to be updated forcefully.
Try following to force the updates:
mvn clean install -U
I see in your error you have pasted:
"...was cached in the local repository, resolution will not be
reattempted until the update interval of mycompany".
so you want to delete this cache, i.e. to delete it from the local repo. Go to your local repo (usually .m2/...) and delete the "placeholder": go to directory org/glassfish/javaeetutorial/7.0.5 and there you should see roster-common.XXX cached - delete it.
If this keep happening, after you deleted the 'cached' from the repo, it means that maven cannot find it in any repo. So you have to re-check your repositories definitions. For example, why don't you have the "central" repo defined in your settings.xml (like all other repos)?

Difference between repository and pluginrepository

My Android Maven project pom.xml contains the following entries. Now everything works fine. What is the difference between <repositories> entries and the <pluginRepositories> entries.
<repositories>
<repository>
<id>my-repo</id>
<url>http://10.10.10.230:8081/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>my-repo</id>
<name>my-repo</name>
<url>http://10.10.10.230:8081/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
As #otakun85 stated, There is no technical difference at all. It's for having different configurations->behavior for plugins in contrary to normal artifacts. See repository vs. pluginRepository for more details.
Also check maven-users mailing list archives, It provides quite good explanation to it.
Maven will resolve plugin dependencies using the configured pluginRepository. Other artifact dependencies (eg. a parent pom) are resolved using repository.
Note: Things available on maven central will be resolved by default so you wouldn't normally need to include repository for those.
For example, if your pom.xml specifies a parent pom and a plugin dependency that both exist in the same repository you must still specify both repository AND pluginRepository. If you only configure one then maven will complain with "Unresolvable X" errors.

Get dependencies from multiple repo's

Is it possible to download dependencies in maven using multiple plugin-repos?
I have my settings.xml configured to get dependencies from a custom repo and because of this, i am unable to get dependencies from the main maven repo server.
Is this possible to setup more then one plugin Repo?
Here is what i have setup so far for my custom repo:
</profiles>
<profile>
<id>custom-config</id>
<repositories>
<repository>
<id>custom-snapshots</id>
<name>customSnapshots</name>
<releases>
<enabled>false</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>warn</checksumPolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
<url>http:/custom/repo</url>
<layout>default</layout>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>custom-plugins</id>
<urlhttp:/custom/repo/public-snapshots</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
I have not included the dependencies here, but I am unable to pull and resolve some library dependencies.
The maven repo that I use is http://mvnrepository.com/ but I dont have details on the exact repo settings to use as the one I defined for a custom one.
The default maven repository is called "central". Its url is: http://repo1.maven.org/maven2/ or nowadays: http://repo.maven.apache.org/maven2/
But it is usually configured as mirrorOf. If you create a repository in your settings.xml and give it the id *central" it will replace it.
So I wonder why you can't resolve dependencies from there. Usually adding a repository in settings.xml does not turn of central.
could you execute mvn help:effective-settings and mvn help:effective-pom and have a loook at all repositories, profiles and mirrorOf elements in the xml? central should be there.
I would also recommend using a Maven proxy like Nexus or Artifactory. It simplifies a lot of things within a company.

maven repository eclipse project

A quick question.
A am new to pom repositories.
I added this
<repository>
<id>tapx</id>
<name>howard lewisship snapshot repository</name>
<url>http://howardlewisship.com/snapshot-repository/</url>
</repository>
to pom file to get these files for tapestry project.
sha1 left and filename ont the right
7155233ba0dfbd99e19358f57e262ad484a440c6 tapx-core-1.1-20110620.210912-27.jar
822c300e6b6d93c53216d8d4fbb9b13217a7fb84 tapx-core-1.2-20110705.222421-4.jar
c11b3134128c3267f55dc4f8bfaab2f1f68ba711 tapx-datefield-1.1-20110617.214353-17.jar
ba2f05929baf2c01d22300953e983ac7a8f791b5 tapx-datefield-1.2-20110705.222544-4.jar
rebuild the index for added project repository
in eclipse when i enter sha1sum on the dependency searcher in eclipse i get 0 results.
Please tell me what i did wrong?
Enable snapshots; IIRC they're disabled by default.
<repository>
<id>tapx</id>
<name>howard lewisship snapshot repository</name>
<url>http://howardlewisship.com/snapshot-repository/</url>
<snapshots>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
</repository>
Also see this super-POM reference info.

Resources