How to include local artifacts with Maven dependency:go-offline - java

I'm trying to generate an offline local maven repository folder for my project, which includes both remote dependencies, and a few dependencies to local projects.
When I run mvn install in my project, Maven succeeds in resolving both remote and local dependencies. Now, in order to have all dependencies available offline, I want to have a local repository folder in my project. Using the command mvn dependency:go-offline -D"maven.repo.local"="./maven-local" I try to achieve this. However, Maven manages to place all remote dependencies in the local folder, but not the local dependencies to my local projects (which have been installed already).
The error I get is:
Failed to execute goal on project genericgateway: Could not resolve
dependencies for project org.my:ownproject:jar:1.0.1: The following
artifacts could not be resolved: org.my:otherproject:jar:1.0.1: Could
not find artifact org.my:otherproject:jar:1.0.1 in central
(https://repo.maven.apache.org/maven2)
How can I tell Maven to also search in my local ~/.m2 repository for these projects?

Basically you should work with one local repository for compilation of maven project.
So, you have three options:
Option 1
Don't specify a local repo while executing mvn dependency:go-offline. Let it download into you regular local repo (~/.m2 by default)
Install the local artifact there as well and compile against this repository.
Option 2
Compile local projects into ./maven-local with maven.repo.local flag as you did. The point is that that both local and downloaded artifacts will be in the same repo.
If you want, you can configure a local repo in the settings.xml (see this answer
Option 3
IMO Overkill for local dev env, but still...
If you absolutely have to separate the repositories you can install a software like Nexus/Artifactory locally - it can provide a flexible repository management and then configure different repositories, but then again, it will be like a remote repo residing in your local PC, maven will create a local cache with both local and remote artifacts, still in the same repo.

Related

Instead of Maven Repo, usage of .m2 directory

I have worked in the offline development environment.
First, I downloaded dependencies from the maven repository via the maven central repository. After, moving the .m2 folder to the offline development environment is it possible to work without a maven repository
You should read https://maven.apache.org/guides/mini/guide-configuring-maven.html.
You may pass the path to a local repo via -Dmaven.repo.local=/path/to/repo. If you use it regularly you should probably add an alias for mvn.
Or you add <localRepository>/path/to/local/repo/</localRepository> to your build file.
Maven should look in the local repo first anyway (default is ~/.m2/repository). So if you have all the required dependencies in the required version there maven should not make any requests to the outside wordl. But that's just a guess.

How to download JAR with classifier from Maven repository?

I am trying to download JAR named mygroup-myid-myversion-jar-with-dependencies.jar from maven repository and tried commands
mvn -q org.apache.maven.plugins:maven-dependency-plugin:2.1:get -DrepoUrl=MYURL -Dartifact=mygroups:myid:myversion:jar-with-dependencies
mvn -q org.apache.maven.plugins:maven-dependency-plugin:2.1:get -DrepoUrl=MYURL -Dartifact=mygroups:myid:myversion-jar-with-dependencies
And both failed with error of being unable to find artifact.
Is this addendum called "classifier"?
How to donload JAR with classifier?
Use -Dclassifier=<classifier> or -Dclassifiers=<classifiers> if you have more to download.
This worked for me:
mvn com.googlecode.maven-download-plugin:download-maven-plugin:artifact -DgroupId=org.jolokia -DartifactId=jolokia-jvm -Dversion=1.6.0 -Dclassifier=agent
This one happened to me. I have a remote repository on one of the internet sites and our internal nexus are not getting those dependencies remotely from this host. We have a security setup that only nexus server can connect from outside world and our dev machines have no access to those kinds of remote repository hosts.
All of the artifacts are fine and can be downloaded via proxy repository but some are not, specially like this artifact with dependency classifier below.
<dependency>
<groupId>com.asset</groupId>
<artifactId>integration-adapter</artifactId>
<version>1.28.76</version>
<classifier>jar-with-dependencies</classifier>
</dependency>
Here are the steps that works for our development teams.
1.) As I'm admin I can remote download those problematic artifacts.
2.) From a secured host, make this file available.
3.) Follow this link from Nexus https://support.sonatype.com/hc/en-us/articles/213465818-How-can-I-programmatically-upload-an-artifact-into-Nexus-2-
4.) This is how I build/deploy to an internal repo so clients can download during their own specific builds for their projects.
mvn deploy:deploy-file -DgroupId=com.asset -DartifactId=integration-adapter -Dversion=1.28.76 -Dclassifier=jar-with-dependencies -DgeneratePom=true -Dpackaging=jar -DrepositoryId=nexus -Durl="http://your-nexus-host:8081/nexus/content/repositories/repo-releases/" -Dfile=integration-adapter-1.28.76-jar-with-dependencies.jar -DupdateReleaseInfo=true
Doing above way creates pom files and meta data in our corporate nexus so maven clients can download those artifacts.
5.) At your .pom file please add these dependencies below:
Looks like in this remote repository (the external host) these files were uploaded directly that is why there are missing maven pom files and we as consumers/clients cannot build it as normal with other working artifacts they have.
Note : So if your are publishing artifacts to the outside world and make your artifacts downloadable make sure you know and read on step 3 above.

How to add java library without no repository to pom file?

I'd like to add one project A as my dependency, but unfortunately, there's no repository host this library. I know that I can install it to local repository manually, then refer this in pom file. But I have a travis build job where there's no such artifact, is there any way that I can install this library to local repo automatically ? Thanks
I would recommend to use the clean approach and uploading this library into your own repository. If you don't have one: time to get one running.
If you're really not up to this task the maven install plugin: http://maven.apache.org/plugins/maven-install-plugin/install-file-mojo.html can install a jar in the local repository. This will work both locally and on a CI server.
To upload a jar in a remote repository there is the deploy plugin: http://maven.apache.org/plugins/maven-deploy-plugin/deploy-file-mojo.html
If you bind the execution of this plugin to a very early phase in the maven life-cycle (validate) you might be able to avoid a build step required prior of your own build.

Download a Maven artifact and install into a specific local repository (not .m2)

I have several local Maven repositories besides the one located in ~/.m2 directory and I want to simplify the process of installing new artifacts into them from Maven central.
So far I couldn't find a way to tell mvn dependency:get that dependency should be put into a specific local repository.
I did manage to find a way to install a given downloaded artifact using mvn install:install-file -DlocalRepositoryPath=, but I want to be able to get and put dependencies into a specific repository with as few manual steps as possible.
Before you ask why can't I just configure my project to use Maven central directly here is the answer: the project uses Gradle and I do not own its build script (i.e. I can't modify it). The project build script is written to work with several distinct repositories having the same base URI that I fortunately can change using build.properties file. So my idea is to have several local maven repositories in the same root directory and trick the build script to use them.
You can use the maven.repo.local property:
mvn dependency:get -Dmaven.repo.local=/path/to/localrepo

Quickest POM settings to turn an existing Eclipse web project in a Maven-managed project?

I'm converting an existing Eclipse-based web project to a Maven-managed one.
Since the project has lots of dependencies, many of which are custom (they're either internally made or they've been taken from sources that have no public repository), is there some 'magic' Maven POM setting that will let me load every jar from WebContent/WEB-INF/lib and make the project work as before right now, so that I can configure each dependency and do the necessary refactoring to turn it to a proper Maven project with a little more time and care?
I have already seen this question, but the project must continue to compile inside Eclipse, so - or at least I guess - it is not just a matter of using the Maven war plugin
What you want to do is called "installing" your non-mavenized JARs into your maven repository. This can be a local or remote repo that you host.
The command to install to your local repo is something like this: mvn install:install-file -Dfile=My-lib.jar -DgroupId=com.mycompany -DartifactId=My-lib -Dversion=1.2.3 -Dpackaging=jar
You'll want to review the various options for install to suit your project.
Once the non-mavenized dependencies are installed to your repo you can add them to your pom like any other maven dependency. They will be fetched from your local repo.
You will have to set up your own remote repo (like Artifactory) or install each plugin for every developer and CI server in your environment for others on your team to build the project. I strongly reccomend Artifactory, it makes it easy on your and your team to use maven and get dependencies.

Categories

Resources