web-dev-qa-db-ja.com

Maven-ワークスペースのローカルリポジトリへのアーティファクトのインストール

〜/ .m2/repositoryからのサードパーティの依存関係を使用しながら、 'mvn install'がソース(チェックアウト)ルートの下のリポジトリフォルダーにファイルを配置する方法が欲しいのですが。

したがって、「mvn install」後のレイアウトは次のとおりです。

/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

(特に、/ work/project/repositoryにはlog4jが含まれていません)

要するに、他のリポジトリを参照する複合リポジトリを作成する方法を探しています

私の意図は、同じソースの複数のチェックアウトを用意し、「インストール」を使用してローカルリポジトリで互いに上書きせずに、それぞれで作業できるようにすることです。複数のチェックアウトは、cvs/svnの異なるブランチでの作業が原因である可能性がありますが、私の場合は、gitでのマスターブランチのクローンが原因です(gitでは、各クローンはブランチのようなものです)。私は、チェックアウトごとに特別なバージョン/分類子を使用するか、切り替えるたびにすべてを再インストール(再構築)するという選択肢が好きではありません。

20
IttayD

Mavenは複数のリポジトリ(ローカル、リモート、「偽のリモート」)を検索して依存関係を解決できますが、[〜#〜] one [〜#〜]のみ存在し、install。アーティファクトを特定の場所にインストールし、何も壊さずにこのリストを維持することは、実際には悪夢です。

しかし、TBH、私は要点を理解していません。それで、なぜあなたはこれをしたいのですか?アーティファクトをローカルリポジトリにインストールし、プロジェクトのルートの下にコピーするなど、代替のはるかに単純なソリューションがある場合があります。なぜこれはうまくいかないのですか?私は最終的な意図を本当に知りたいのですが。

PDATE:最初の質問の更新を読んだ後、私が考えることができる唯一の解決策(異なるバージョン/タグを使用したくない場合)は、2つのローカルリポジトリを使用して切り替えることですそれらの間(ただし、非常にエラーが発生しやすい)。

これを行うには、別のユーザーアカウントを使用します(ローカルリポジトリはデフォルトでユーザー固有であるため)。

または、切り替えるたびに~/.m2/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">
  <localRepository>${user.home}/.m2/repository</localRepository>
  <!--localRepository>${user.home}/.m2/repository2</localRepository-->
  ...
</settings>

または、別のsettings.xmlを用意し、--settingsオプションを使用してポイントします。

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

または、-Dmaven.repo.localオプションを使用して、コマンドラインで代替の場所を指定します。

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

私が言ったように、これらのソリューションはすべてエラーが発生しやすく、どれも非常に満足できるものではありません。複数のブランチを並行して処理する非常に良い理由がある場合でも、ユースケース(すべてを再構築しない)はあまり一般的ではありません。ここでは、個別のユーザーアカウントを使用する方がソリューションのIMOの悪化は少ないと言えます。

29
Pascal Thivent

参考:シンボリックリンクはWindows7以降で機能するため、すべてのコードをローカルリポジトリの同じ場所(/ com/myco /)に配置すると、このようなことを簡単に実現できます。

詳細はmklinkと入力してください

0
teknopaul

これはコマンドラインで実際に可能であり、実際には非常に便利です。たとえば、Eclipseプロジェクトの下に追加のリポジトリを作成する場合は、次のようにします。

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

これは「localRepositoryPath」パラメーターであり、必要なローカルリポジトリにインストールを送信します。

これは、プロジェクトルートから実行するバッチファイルにあり、プロジェクト内の "repo"ディレクトリにファイルをインストールします(したがって、%パラメーター)。では、なぜこれを実行するのでしょうか。さて、あなたはプロフェッショナルサービスコンサルタントであり、セキュリティ強化されたラップトップを使用せざるを得ない顧客の場所に定期的に行くとします。自己完結型プロジェクトをUSBスティックからラップトップにコピーすると、mavenビルドを問題なく行うことができます。

一般に、あなたのラップトップを使用している場合は、すべてが入っている単一のローカルリポジトリを持つことは理にかなっています。しかし、生意気になって「なぜそんなことをしたいのか」と言ったあなたには、いくつかの知らせがあります。自分のものではないラップトップを使用していて、そのラップトップでプロジェクトをビルドし、結果のアーティファクトを取得してから、プロジェクトディレクトリ(および使用したローカルリポジトリ)を削除する必要がある場合、これが方法です。

2つのローカルリポジトリが必要な理由については、デフォルトの.m2/repositoryが会社の標準的なものを配置する場所であり、ローカルの「プロジェクト内」リポジトリはあなたの場所を配置する場所です。

0
Ken Kopelson

これはコマンドラインクライアントでは不可能ですが、Mavenリポジトリサーバーで Nexus のようなより複雑なリポジトリレイアウトを作成できます。

それが不可能である理由は、Mavenがプロジェクトをネストすることを許可し、それらのほとんどがお互いを参照するため、各アーティファクトを異なるリポジトリにインストールすると、ローカルハードディスクで多くの検索が行われる(または、サブプロジェクトでビルドします)。

0
Aaron Digulla