Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Maven - installing artifacts to a local repository in workspace

Tags:

I'd like to have a way in which 'mvn install' puts files in a repository folder under my source (checkout) root, while using 3rd party dependencies from ~/.m2/repository.

So after 'mvn install', the layout is:

/work/project/     repository       com/example/foo-1.0.jar       com/example/bar-1.0.jar     foo       src/main/java     bar       src/main/java  ~/.m2/repository     log4j/log4j/1.2/log4j-1.2.jar 

(In particular, /work/project/repository does not contain log4j)

In essense, I'm looking for a way of creating a composite repository that references other repositories

My intention is to be able to have multiple checkouts of the same source and work on each without overwriting each other in the local repository with 'install'. Multiple checkouts can be because of working on different branches in cvs/svn but in my case it is due to cloning of the master branch in git (in git, each clone is like a branch). I don't like the alternatives which are to use a special version/classifier per checkout or to reinstall (rebuild) everything each time I switch.

like image 415
IttayD Avatar asked Jan 07 '10 07:01

IttayD


People also ask

What Maven command will install the package in local repository?

In Maven, you can use “ mvn install ” to package your project and deploy to local repository automatically, so that other developers can use it.


2 Answers

Maven can search multiple repositories (local, remote, "fake" remote) to resolve dependencies but there is only ONE local repository where artifacts get installed during install. It would be a real nightmare to install artifacts into specific locations and to maintain this list without breaking anything, that would just not work, you don't want to do this.

But, TBH, I don't get the point. So, why do you want to do this? There might be alternative and much simpler solutions, like installing your artifacts in the local repository and then copying them under your project root. Why wouldn't this work? I'd really like to know the final intention though.

UPDATE: Having read the update of the initial question, the only solution I can think of (given that you don't want to use different versions/tags) would be to use two local repositories and to switch between them (very error prone though).

To do so, either use different user accounts (as the local repository is user specific by default).

Or update your ~/.m2/settings.xml each time you want to switch:

<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">   <localRepository>${user.home}/.m2/repository</localRepository>   <!--localRepository>${user.home}/.m2/repository2</localRepository-->   ... </settings> 

Or have another settings.xml and point on it using the --settings option:

mvn install --settings /path/to/alternate/settings.xml 

Or specify the alternate location on the command line using the -Dmaven.repo.local option:

mvn -Dmaven.repo.local=/path/to/repo 

These solutions are all error prone as I said and none of them is very satisfying. Even if you might have very good reasons to work on several branches in parallel, your use case (not rebuilding everything) is not very common. Here, using distinct user accounts migh be the less worse solution IMO.

like image 186
Pascal Thivent Avatar answered Sep 23 '22 02:09

Pascal Thivent


This is INDEED possible with the command line, and in fact is quite useful. For example, if you want to create an additional repo under your Eclipse project, you just do:

mvn install:install-file -DlocalRepositoryPath=repo \    -DcreateChecksum=true -Dpackaging=jar \    -Dfile=%2 -DgroupId=%3 -DartifactId=%4 -Dversion=%5 

It's the "localRepositoryPath" parameter that will direct your install to any local repo you want.

I have this in a batch file that I run from my project root, and it installs the file into a "repo" directory within my project (hence the % parameters). So why would you want to do this? Well, let's you say you are professional services consultant, and you regularly go into customer locations where you are forced to use their security hardened laptops. You copy your self-contained project to their laptop from a USB stick, and presto, you can do your maven build no problem.

Generally, if you are using YOUR laptop, then it makes sense to have a single local repo that has everything in it. But to you who got cocky and said things like "why would you want to do that", I have some news...the world is a bigger place with more options than you might realize. If you are using laptops that are NOT yours, and you need to build your project on that laptop, get the resulting artifact, and then remove your project directory (and the local repo you just used), this is the way to go.

As to why you would want to have 2 local repos, the default .m2/repository is where the companies standard stuff goes, and the local "in project" repo is where YOUR stuff goes.

like image 30
Ken Kopelson Avatar answered Sep 24 '22 02:09

Ken Kopelson