m2eclipse not showing latest artifacts in search - eclipse

I am using Eclipse with the m2eclipse plugin and have setup a nexus repository mirror. When I search for artifacts it does not show the most recent versions; sometimes it shows very outdated versions of artifacts. I usually end up searching online for the latest version. Do I have something configured incorrectly, or is this a bug? I am currently on Eclipse Kepler, but this also happened in the Juno version.
For example, I tried adding the groovy dependency, which is currently on version 2.1.6. The latest (non-beta) shown is 1.8.1:
I don't think it has anything to do with Nexus. I can view my nexus repository in the Maven Repositories view in Eclipse. Also, if I manually type in the latest version there are not errors, so the JAR file(s) are pulled in correctly.
Here is my local settings.xml referencing the Nexus mirror:
<?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">
<pluginGroups>
</pluginGroups>
<proxies>
</proxies>
<servers>
<server>
<id>nexus</id>
<username>deployment</username>
<password>mypassword</password>
</server>
</servers>
<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>central</mirrorOf>
<url>http://myserver/nexus/content/groups/public</url>
</mirror>
</mirrors>
<profiles>
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>central</id>
<url>http://central</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</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>nexus</activeProfile>
</activeProfiles>

This is most probably a problem with downloading the index files from Nexus.
Make sure you can find the latest version of the dependency when searching in the Nexus web UI. If this doesn't work, then Nexus fails to download the indexes from the upstream sites. Check for errors in the logs and manually trigger the download.
If the search on your Nexus works, make sure m2e can download the indexes when you start Eclipse. Look in the progress view when you start Eclipse; it should tell you that it downloads the indexes from Nexus.
You can also have a look at the Maven Console (in your console view; enable DEBUG to see more) right after starting Eclipse.
Lastly, you can start Eclipse with java instead of javaw. It will then print some debug information to a console/terminal window.

Related

How to cache artifact from a public repository(e.g., Maven Central) to a private-owned nexus repository?

Basically, I am asking the same thing as the question linked here.
However, I don't think the picked answer solved the question. In addition, the former one was asked years ago.
The Nexus OSS version I installed is 2.11.2-06(the latest version).
I CAN cache an artifact if I search with the nexus GUI and click download button.
However, an artifact IS NOT cached if I declare it in the pom file in eclipse. It will just fetch it from MAVEN CENTRAL and cache it locally in my computer but not in the Nexus Repository.
I WISH when I declare a dependency in the POM file in eclipse, if it is not cached locally, maven will fetch it from MAVEN CENTRAL, cache it both locally in my computer AND in the Nexus Repository as well.
My maven settings.xml is shown below:
<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">
<profiles>
<profile>
<id>kingstar-internal</id>
<repositories>
<repository>
<id>kingstar-internal-repository</id>
<name>Kingstar Internal Repository</name>
<url>http://localhost:8081/nexus/content/repositories/KingstarRepository</url>
</repository>
<repository>
<id>kingstar-snapshot-repository</id>
<name>Kingstar Snapshot Repository</name>
<url>http://localhost:8081/nexus/content/repositories/KingstarSnapshotRepository</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>
<mirrors>
<mirror>
<id>public-mirror</id>
<mirrorOf>*</mirrorOf>
<name>public mirror</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
</mirror>
</mirrors>
<activeProfiles>
<activeProfile>kingstar-internal</activeProfile>
</activeProfiles>
<servers>
<server>
<id>kingstar-internal-repository</id>
<username>deployment</username>
<password>deployment</password>
</server>
<server>
<id>kingstar-snapshot-repository</id>
<username>deployment</username>
<password>deployment</password>
</server>
</servers>
</settings>
Any help is appreciated!

maven settings for multiple mirrors

I have a few personal projects and few corporate ones. The corporate projects use a mirrored corporate SVN repo for maven dependencies. I would like to configure my settings.xml in such a way that the dependencies are first checked against my corporate mirror. Only when the dependencies are not found here (for my personal projects) then it should check against the original "central" repo that is mirrored by my corporate repo. Is this possible. Below is a snippet of what I have right now but it doesn't hit the "central" repo when required. Thanks.
<servers>
<server>
<id>central-mirror</id>
<username>myusername</username>
<password>mypassword</password>
<filePermissions>664</filePermissions>
<directoryPermissions>775</directoryPermissions>
<configuration></configuration>
</server>
</servers>
<mirrors>
<mirror>
<id>central-mirror</id>
<url>https://url.to.my/mirror</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<proxies>
<proxy>
<id>proxy</id>
<active>true</active>
<protocol>http</protocol>
<host>my.corporate.proxy</host>
<port>8080</port>
<nonProxyHosts>localhost|*.my.corporate.proxy</nonProxyHosts>
</proxy>
Ok after some trial and error I finally figured out how to do this. I am hoping this will help out many others. Below is my updated settings.xml. For any project in my Eclipse, maven first tries to download libs from my corporate mirror. Only if it can't find it there, it gets it from central repo.
<servers>
<server>
<id>central-mirror</id>
<username>myusername</username>
<password>mypassword</password>
<filePermissions>664</filePermissions>
<directoryPermissions>775</directoryPermissions>
<configuration></configuration>
</server>
</servers>
<mirrors>
<mirror>
<id>central-mirror</id>
<url>https://url.to.my/mirror</url>
<mirrorOf>*,!central</mirrorOf>
</mirror>
</mirrors>
<proxies>
<proxy>
<id>proxy</id>
<active>true</active>
<protocol>http</protocol>
<host>my.corporate.proxy</host>
<port>8080</port>
<nonProxyHosts>localhost|*.my.corporate.proxy</nonProxyHosts>
</proxy>
<profiles>
<profile>
<activeByDefault>true</activeByDefault>
<repositories>
<repository>
<id>central-mirror</id>
<url>https://url.to.my/mirror</url>
</repository>
</repositories>
</profile>
</profiles
well I have a similar scenario where if an artifact is not available in corporate repo then it should default to global repo.
I made two changes in my original settings.xml-
define a <proxy> tag for your network
If mirrorOf property is * then change it to repo ID

Dependencies from pom.xml not considered by Eclipse in Tycho Project

I created a Tycho project with an eclipse-plugin packaging. The project includes some dependencies that are specified via pom.xml. The relevant pom sections are:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<tycho.version>0.15.0</tycho.version>
</properties>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<groupId>org.eclipse.tycho</groupId>
<artifactId>tycho-maven-plugin</artifactId>
<version>${tycho.version}</version>
<extensions>true</extensions>
</plugin>
<plugin>
<groupId>org.eclipse.tycho</groupId>
<artifactId>target-platform-configuration</artifactId>
<version>${tycho.version}</version>
<configuration>
<pomDependencies>consider</pomDependencies>
<environments>
<environment>
<os>win32</os>
<ws>win32</ws>
<arch>x86</arch>
</environment>
<environment>
<os>linux</os>
<ws>gtk</ws>
<arch>x86_64</arch>
</environment>
<environment>
<os>macosx</os>
<ws>cocoa</ws>
<arch>x86_64</arch>
</environment>
</environments>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>juno</id>
<layout>p2</layout>
<url>http://download.eclipse.org/releases/juno</url>
</repository>
<repository>
<id>com.springsource.repository.bundles.release</id>
<name>SpringSource Enterprise Bundle Repository - SpringSource Bundle Releases</name>
<url>http://repository.springsource.com/maven/bundles/release</url>
</repository>
<repository>
<id>com.springsource.repository.bundles.external</id>
<name>SpringSource Enterprise Bundle Repository - External Bundle Releases</name>
<url>http://repository.springsource.com/maven/bundles/external</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.testng</groupId>
<artifactId>com.springsource.org.testng</artifactId>
<version>6.4.0</version>
</dependency>
<dependency>
<groupId>com.google.guice</groupId>
<artifactId>com.springsource.com.google.inject</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.aopalliance</groupId>
<artifactId>com.springsource.org.aopalliance</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
And the Manifest is:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Plugin-project-pure
Bundle-SymbolicName: plugin-project-pure
Bundle-Version: 1.0.0.qualifier
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Require-Bundle: org.eclipse.equinox.app,
org.eclipse.uml2.uml;bundle-version="4.0.0",
org.eclipse.uml2.uml.resources;bundle-version="4.0.0",
org.junit;bundle-version="4.10.0",
com.springsource.org.testng;bundle-version="[6.4.0,6.4.0]"
The project only consists of a class in the default package that uses an annotation from org.testng.annotations to test that during compilation the dependency is included.
If I'm building the project on the command line with Maven 3.0.4 everything works fine. After importing the project in Eclipse Juno, I get multiple errors. The most important one is in the manifest and it states that the bundle com.springsource.org.testng can't be resolved. There is also a compile error in the class, because the import of the annotation is not possible. The project has the Maven Nature configured. Am I missing something so that Eclipse Juno will also consider the dependencies of the pom?
You can circumvent this problem splitting your project build into two parts:
First, aggregate your POM dependencies into a p2 repository. You'll need an eclipse-feature and an eclipse-repository module for this, plus a separate parent POM that lists the POM dependencies and configures pomDependencies=consider.
In the second build, add the p2 repository from the first build to the target platform, e.g. via a jar:file: URL pointing to the build result in your local Maven repository.
Then, you can also configure your target platform in Eclipse to include the p2 repository from the first build (which depends on how you currently configure it). You'll get the best consistency between Tycho and Eclipse if you use a so-called target definition file, which you can use both as target platform in Eclipse and in Tycho.
I am aware that all this is quite a bit of effort to set up, but AFAIK there are no better solutions that fully work.
The most elegant solution to all problems that exist between maven-RCP problems is to use the
p2-maven-plugin. Here is the brief summary of those problems (cuts from the link above):
In order to add a third-party dependency to an Eclipse RCP project the
dependency has to reside in a P2 update site.
Eclipse (and other providers) provide a set of public update sites,
but obviously not all popular and publicly available dependencies are
there (that is the problem number #1).
Since Eclipse RCP is an OSGi environment in order to add a dependency
to a p2 update site the depenedncy has to be an OSGi bundle (that is
the problem number #2).
So, let’s sum up for now: all our artifacts have to be OSGi bundles,
but they are not always bundles and they have to be located in a P2
site, but we do not have that site. How do we proceed then?
It is not that difficult, there is a ‘bnd’ tool written by Peter
Kriens that can transform your jars into bundles. There is also a
convenience tool provided by Eclipse RCP that can generate a P2 site
(in a cumbersome and painful way though). Both tools assume that all
your jars/bundles are located in a local folder - which means that you
have to download them by-hand. You could use Maven to automate it a
bit, but there is a significant difference in the way how Maven
calculates a dependency tree and this is not alwyas compatible with
the OSGi way (that is the problem number #3). Let us elaborate on it a
bit more.
It allows you to define a pom-packaged project that will resolve all maven dependencies, convert all non-OSGi ones to bundles and generate a p2 site from them.
Below is the full minimal pom file including the dependency on slf4j-log4j12 (which implicitly depends on both slf4j and log4j v1.2):
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>me.berezovskiy.project</groupId>
<artifactId>p2</artifactId>
<packaging>pom</packaging>
<version>1.0.0</version>
<build>
<plugins>
<plugin>
<groupId>org.reficio</groupId>
<artifactId>p2-maven-plugin</artifactId>
<version>1.1.1-SNAPSHOT</version>
<executions>
<execution>
<id>default-cli</id>
<configuration>
<artifacts>
<artifact>
<id>org.slf4j:slf4j-log4j12:1.7.7</id>
</artifact>
</artifacts>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>8.1.12.v20130726</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<webAppSourceDirectory>${basedir}/target/repository/</webAppSourceDirectory>
<webApp>
<contextPath>/site</contextPath>
</webApp>
</configuration>
</plugin>
</plugins>
</build>
<pluginRepositories>
<pluginRepository>
<id>reficio</id>
<url>http://repo.reficio.org/maven/</url>
</pluginRepository>
</pluginRepositories>
</project>
P.S. I usually do not post answers to old and answered questions, but in my case it took so long to resolve this issue in a clean and elegant way that I decided to write about it. Additionally, the solution has appeared in late 2013.
from the command line navigate to the folder where the pom.xml is located.
Run mvn eclipse:eclipse.
This should build a valid eclipse project.

What are the p2 repository URLs for Eclipse 4.x releases?

For an Eclipse plugin project I use Maven and Tycho to build it. The Tycho configuration for target platform is
<plugin>
<groupId>org.eclipse.tycho</groupId>
<artifactId>target-platform-configuration</artifactId>
<version>${tycho-version}</version>
<configuration>
<resolver>p2</resolver>
</configuration>
</plugin>
The repository is declared as
<repositories>
<repository>
<id>${platform-version-name}</id>
<layout>p2</layout>
<url>${eclipse-site}</url>
</repository>
</repositories>
and the values are declared as
<properties>
<platform-version-name>galileo</platform-version-name>
<eclipse-site>http://download.eclipse.org/releases/${platform-version-name}</eclipse-site>
</properties>
This is the approach shown in all tutorials. Using this approach I can test my plugin for every version it should support (3.5 and up). Success.
BUT I wasn't able to figure out the proper URLs for the 4.x releases, so I could also test against 4.0 and 4.1 and possibly 4.2 Nightly.
Can I use the same approach to use Eclipse 4.x as a target platform and what would be the p2 repository URLs?
see http://wiki.eclipse.org/Eclipse_Project_Update_Sites

How to upload maven plugin to Nexus repository?

I want to upload my custom maven plugin to nexus repository.
My problem is that when I upload my plugin to nexus via web IU like ordinary dependency, maven can't find it:
Plugin com.huawei:maven-project-version-plugin:1.0 or one of its
dependencies could not be resolved: Failed to read artifact descriptor
for com.huawei:maven-project-version-plugin:jar:1.0: Failure to find
com.mycompany:maven-project-version-plugin:pom:1.0 in
http://localhost:8081/nexus/content/groups/public was cached in the
local repository, resolution will not be reattempted until the update
interval of nexus has elapsed or updates are forced -> [Help 1]
But when I am install my plugin to maven local repositiry (not nexus) via command line all is fine.
So, what is the difference between installing custom maven plugin and installing "non plugin" artefacts? Are there any tricks?
My settings.xml:
<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>
<!--This sends everything else to /public -->
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://localhost: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>http://central</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</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>
<!--make the profile active all the time -->
<activeProfile>nexus</activeProfile>
</activeProfiles>
</settings>
The problem was solved. Well, I don't know how, but today all is work. I think the problem was in Nexus cache. I just deleted my hosted repository and created it again. Perhaps, there are less radical methods, but I don't know them =) Delete artifact and then just "expire cache" not help in my case.
Well, the answer of my question: There is no any different between installation plugin and non plugin artifact in Nexus, except one. If you select GAV Definition: GAV parameters, you must select "maven-plugin" in combobox "Packaging".
I think there is no need to write step by step instruction, it is very simple. Just select your hosted repository -> Artifact Upload tab and fill required fields.
Also to add that you must also upload the pom of your Maven plugin. If you don't Nexus will auto generate one which is not correct. i.e. it will just be a basic pom consisting of version, artifactID, packaging, and groupID.