I am building eclipse plugins with maven, for eclipse oxygen 3.
My maven configuration uses following repository.
<repository>
<id>eclipse</id>
<url>http://download.eclipse.org/releases/neon/201705151400/</url>
<layout>p2</layout>
</repository>
And one of my plugins depends on our custom patched version of org.eclipse.tcf.te.tcf.launch.cdt that exists in this repository.
I would like to specify in my maven to use patched version of this plugin for solving it's dependency.
How should I do it? Suppose I have a local separated P2 repo that has this only patch.
If I am adding a new repository, the build still fails.
<repository>
<id>TCF</id>
<url>file:<my_path>/tcf_patch-1.5.0.v20181116</url>
<layout>p2</layout>
</repository>
Update
I have solved my problem, and my original attempt to solve it was correct. Just the patch I used was wrong.
So, basically it is sufficient for maven.
If Original plugins are accessible from
<repository>
<id>eclipse</id>
<url>http://download.eclipse.org/releases/oxygen/201804111000</url>
<layout>p2</layout>
</repository>
And my patch resides in
<repository>
<id>TCF</id>
<url>file: ../TCF_PATCH_20181116</url>
<layout>p2</layout>
</repository>
Maven is able to apply latest version of eclipse plugins available from provided repositories for solving dependencies. Cool ;)
Related
I'm looking for a way to upload and store multiple versions of an artifact to the Sonatype Nexus maven-2 repository, so a team has access to previous versions of the artifact if a new version was released and uploaded.
I upload a java library to the hosted maven-2 release repository. Everything works well until I upload another version of the same library to the same repository.
After uploading the second version all files are present in the repository, but Maven cannot resolve not first nether second versions.
I tried both ways to upload artifacts - manually with the nexus UI and using the Maven deploy command. Results are the same.
I believe there is a way to store multiple versions in one repository.
Is there a special configuration for that case?
Please, help me to figure out how can I solve this issue.
As I mentioned, I have all settings that allow me to deploy and download one artifact from nexus.
In the library pom.xml I have:
<groupId>com.company.lib</groupId>
<artifactId>LibName</artifactId>
<version>1.0.7</version>
<name>LibName</name>
...
<distributionManagement>
<repository>
<id>testdeploy</id>
<url>https://nexus.company.com/repository/testdeploy/</url>
</repository>
</distributionManagement>
In the project where I want to download a library I have:
<dependencies>
<dependency>
<groupId>com.company.lib</groupId>
<artifactId>LibName</artifactId>
<version>1.0.7</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>testdeploy</id>
<url>https://nexus.company.com/repository/testdeploy/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
In settings.xml I have:
<servers>
<server>
<id>testdeploy</id>
<username>...</username>
<password>...</password>
</server>
<servers>
<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>https://nexus.company.com/repository/maven-public</url>
<name>Nexus M2</name>
</mirror>
<mirror>
<id>central_new</id>
<mirrorOf>central</mirrorOf>
<url>https://repo.maven.apache.org/maven2</url>
</mirror>
</mirrors>
<profiles>
<profile>
<id>release</id>
<repositories>
<repository>
<id>testdeploy</id>
<name>custom repo</name>
<url>https://nexus.company.com/repository/testdeploy/</url>
</repository>
</repositories>
</profile>
</profiles>
After uploading two versions of the library to nexus I have the following file structure:
com
company
lib
LibName
1.0.6
LibName-1.0.6.jar
LibName-1.0.6.jar.md5
LibName-1.0.6.jar.sha1
LibName-1.0.6.pom
LibName-1.0.6.pom.md5
LibName-1.0.6.pom.sha1
1.0.7
LibName-1.0.7.jar
LibName-1.0.7.jar.md5
LibName-1.0.7.jar.sha1
LibName-1.0.7.pom
LibName-1.0.7.pom.md5
LibName-1.0.7.pom.sha1
maven-metadata.xml
maven-metadata.xml.md5
maven-metadata.xml.sh1
When I try to download any of these versions via Maven I get an error
"Could not find artifact com.company.lib:LibName:1.0.6 in nexus (nexus.company.com/repository/maven-public)"
Solution:
In my case there were two problems:
The "testdeploy" repository was not added in maven-public group.
The "testdeploy" repo was made to test deployment artifact's versions from maven. I wanted to deploy another version of the library into the real repo after testing. The problem was that the real repo still had the library with the same artifact id and version. So there was a conflict between the real repo and test repo ("testdeploy") even after adding the "testdeploy" version into the "maven-public" group. To test deployment I had to change the librarie's artifact id.
Once these two issues were solved I didn't need to specify "testdeploy" repository in pom.xml. Defining the settings of the mirror (maven-public) and the server credentials in settings.xml were enough to make it work.
Maven identifies a unique artifact by a combination of 3 values: the groupId, the artifactID and the version. Appending -SNAPSHOT to a version has some additional special behaviour described here
The unique identifier for your artifact per your first pom snippet, would be
com.company.lib:LibName:1.0.7
If you want different addressable artifacts, change the version number. If people are still using the original 1.0.7 you should be producing 1.0.8 or some other incremented version.
Worth noting that projects that build in this often use SemVer and it's a convention that works in well understood ways so is probably a safe place to start.
EDIT TO ADD:
Based on comments, and re-review it looks like whatever is trying to pull 1.0.6 is not doing so from https://nexus.company.com/repository/testdeploy/. Instead it's trying to pull from nexus.company.com/repository/maven-public and failing.
For the project trtying to pull 1.0.6 what is the repository config? Your settings.xml only adds the testdeploy repo if the releases profile is active, so the testdeploy repo would need to be called out in the pom.
Your approach is correct and the normal way to work with different versions.
I guess you just have problems with different repository definitions in your Nexus, or some other network related issue.
So I thought of creating a spring boot project but on my company laptop. I downloaded the project from spring initializer and tried to execute on IntelliJ idea but got this error:
"java: package org.springframework.boot does not exist"
"java: cannot find symbol
symbol: class SpringBootApplication"
I ran maven clean and install cmds but still the same issue. Now I reckon this is happening bc maven is downloading dependencies from my remote company repository.
I remember saving a custom setting.xml file in .m2 folder which contains a custom repository.
So if I am right how can I make maven download from the central repo or solve this problem?
It sounds like you listed your own repository in your POM or settings.xml, like so:
<repositories>
<repository>
<id>vaadin-addons</id>
<url>https://maven.vaadin.com/vaadin-addons</url>
</repository>
</repositories>
Doing so, without also listing Maven Central, will cause Maven to only attempt to resolve from your own repository. You must also list Maven Central, like so:
<repositories>
<repository>
<id>vaadin-addons</id>
<url>https://maven.vaadin.com/vaadin-addons</url>
</repository>
<repository>
<id>central</id>
<url>https://repo1.maven.org/maven2/</url>
</repository>
</repositories>
Maven checks repositories in the order they are specified. You cannot specify a repository per dependency, but you could create a new module with your dependencies and their specific repositories.
How can I add this WorldEdit dependency to my Maven project?
http://maven.sk89q.com/artifactory/repo/com/sk89q/worldedit/worldedit-bukkit/
I need the 6.1.1-SNAPSHOT.
Is there an algorithm to get
Group ID
Artifact ID
and Version?
It's important you understand the task at hand. Maven downloads dependencies from remote repositories based on their unique coordinates. There are two kind of repositories:
release repositories that host release versions of dependencies, i.e. final versions.
snapshot repositories that host snapshot versions of dependencies, i.e. versions that are currently in development, and are not stable yet.
A Maven coordinate is a set (groupId, artifactId, version). It uniquely identifies every dependency (truth be told, there are actually a packaging and a possibly a classifier but it's not important here).
Your problem is to declare a dependency to the worldedit-bukkit-6.1.1-SNAPSHOT dependency. Let's see:
the repository here is http://maven.sk89q.com/artifactory/repo: it is the root of the URL you linked to.
the groupId is com.sk89q.worldedit: this is the rest of the URL, right before
the artifactId, which is worldedit-bukkit and
the version, which is 6.1.1-SNAPSHOT.
If you breakdown the URL, you get
http://maven.sk89q.com/artifactory/repo/com/sk89q/worldedit/worldedit-bukkit/6.1.1-SNAPSHOT/
that is translated into the following Maven coordinates:
{REPOSITORY_URL}/{groupId where dots are slashes}/{artifactId}/{version}/
So now, we need to tell Maven about the repository. By default, Maven looks for artifacts in what's called Maven Central, so we need to add this repository. This is done either in the POM or in the settings.xml file, by adding the following configuration:
<repositories>
<repository>
<id>sk89q-snapshots</id>
<url>http://maven.sk89q.com/artifactory/repo</url>
<releases>
<enabled>true</enabled> <!-- releases enabled: this specific repository also hosts release versions -->
</releases>
<snapshots>
<enabled>true</enabled> <!-- snapshots enabled: we declare a SNAPSHOT repository because we need to download a SNAPSHOT dependency -->
</snapshots>
</repository>
</repositories>
Next step is to actually declare the dependency. This is done in the POM, with the following configuration:
<dependency>
<groupId>com.sk89q.worldedit</groupId>
<artifactId>worldedit-bukkit</artifactId>
<version>6.1.1-SNAPSHOT</version>
</dependency>
And that's it!
How to add new remote repo to the NetBeans 7.2 for using with the Dependency window (with repo indexing)?
I found http://wiki.magnolia-cms.com/display/WIKI/setting+up+Netbeans+with+the+Magnolia+maven+repository but in 7.2 NB this window moved.
In the Dependency there are no button for adding new remote Maven repos.
I need to add http://repo1.maven.org/maven2/org/mortbay/jetty/jetty/7.0.0.pre5/ to the NetBeans.
Sorry my bad English.
Thanks, Arthur.
here is easy method-
Go to Services>Maven Repositories. Right Click>Add Repository
You can edit settings.xml file in maven and add your repository to it. You should add something like:
<repositories>
<repository>
<id>nexus</id>
<name>Repository for JDK 1.6 builds</name>
<url>http://myrepo1:1111/contextpath/</url>
<layout>default</layout>
</repository>
<repository>
<id>nexus-major</id>
<name>Repository for JDK 1.6 builds 2</name>
<url>http://myrepo1:1111/contextpath2/</url>
<layout>default</layout>
</repository>
</repositories>
But this code should be wrapped in profile tag, I think. For more details you can see this.
You can find settings file in $HOME/.m2 directory in linux and same directory in Windows.
Hibernate-core jar version 4.0.0.Final version is not available here.
My pom shows this :
<id>central</id>
<name>Maven Repository Switchboard</name>
<url>http://repo1.maven.org/maven2</url>
Which provides a link to here where the jar IS available ... so I expected my maven build to download dependency, it doesn't.
However if I change to CR7 (which is available on first repository) it does work, suggesting to me that my build actually uses the first link as repository, even though the url "resolves" to the second ... ?
What should my repository definition look like to enable me to get the final version of hibernate release ?
Hibernate suggests using the JBoss Maven repository. I would therefore use a repository defined thusly:
<repository>
<id>Hibernate</id>
<name>JBoss Hibernate repository</name>
<url>http://repository.jboss.org/nexus/content/groups/public/</url>
</repository>
...and any other repository coordinate element you wish to specify.
the repository required was this:
<repository>
<id>Hibernate</id>
<name>JBoss Hibernate repository</name>
<url>https://repository.jboss.org/nexus/content/repositories/releases/</url>
</repository>