Maven:担当者では利用できないjarをJ2EEプロジェクトに含める方法は?


100

私のJ2EEプロジェクトにはいくつかの依存関係があります。これらは専用ライブラリであるため、Mavenリポジトリでは使用できません。これらのライブラリは実行時に使用できる必要があるため、target /.../ WEB-INF / lib ...にコピーする必要があります。

現在、私はそれらをPOMのシステム依存関係としてリストしていますが、この方法では、コンパイル中にターゲットビルドにコピーされないという問題があります。また、この方法はあまりエレガントではありません。

それらをMavenに統合する最良の方法はどれですか?

注:自分のMavenリポジトリーを作成したくありません。


7
私は本当にあなたがMavenのリポジトリを作成するあなたの決定を見直すべきだと思います。それはまったく難しくなく、100%の価値があります。
ロバートムンテアヌ

7
Mavenリポジトリーを作成することの価値は、状況によって異なります。
yincrash 2012年

回答:


54

あなたがあなた自身のリポジトリをセットアップしたくないと言ったように、おそらくこれは助けになるでしょう。

maven-install-plugin のinstall-fileゴールを使用して、ファイルをローカルリポジトリにインストールできます。ファイルごとにMaven呼び出しを使用してスクリプトを作成し、それをjarと一緒に保持すると、ユーザー(およびアクセス権を持つ他のユーザー)がjar(および関連するpomファイル)をローカルリポジトリに簡単にインストールできます。

例えば:

mvn install:install-file -Dfile=/usr/jars/foo.jar -DpomFile=/usr/jars/foo.pom
mvn install:install-file -Dfile=/usr/jars/bar.jar -DpomFile=/usr/jars/bar.pom

あるいは単に

mvn install:install-file -Dfile=ojdbc14.jar -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0 -Dpackaging=jar

その後、プロジェクトで通常どおりに依存関係を参照できます。

ただし、最善の策は、内部リモートリポジトリをセットアップすることです。Nexusを自分で使用することをお勧めします。必要に応じて開発ボックスで実行でき、オーバーヘッドは最小限です。


1
おかげで、この方法は今私にとってうまくいきます。ファイルがローカルの担当者に自動的にインストールされるようにPOMを拡張しました:pastebin.ca/1504318
samson

助けてくれてうれしいですが、他の人が言ったように、最善のアプローチはMavenリポジトリマネージャーを使用することです。このアプローチはうまく拡張できません。
リッチセラー、

4
私のために働いたコマンド:「mvn install:install-file -Dfile = cassandra-jdbc-1.1.1.jar -DgroupId = org.apache-extras.cassandra-jdbc -DartifactId = cassandra-jdbc -Dversion = 1.1.1 -Dpackaging = jar "
マズリック2012年

192

この問題の迅速な解決策を求めている人のために:

<dependency>
  <groupId>LIB_NAME</groupId>
  <artifactId>LIB_NAME</artifactId>
  <version>1.0.0</version>
  <scope>system</scope>
  <systemPath>${basedir}/WebContent/WEB-INF/lib/YOUR_LIB.jar</systemPath>
</dependency>

ライブラリに一意のgroupIDとアーティファクト名を指定し、ファイルシステム内の場所を指定するだけです。準備できた。

もちろん、これはダーティクイックフィックスであり、マシンでのみ機能し、ライブラリへのパスを変更しない場合にのみ機能します。ただし、いくつかのテストを実行して実行するだけで十分な場合もあります。

編集:質問をやり直して、ユーザーがすでに私の解決策を一時的な修正として使用していることに気付きました。私の答えは、この質問に来た他の人のための簡単な助けとして残しておきます。誰かがこれに同意しない場合は、コメントを残してください。:)


4
涼しい。ローカルマシンのパスの代わりにURLを指定する方法はありますか?
phreakhead 2013年

3
完全で実用的な例をありがとう!!! 金の魚を釣って、3つの願いが叶うことを願っています。:)
johndodo 2013年

14
これは自己完結型(pom.xml内)であるため、受け入れられる答えになるはずです
Vikram

2
こんにちはRajarshee、グループとアーティファクトIDは完全に任意です。ファイルシステムでのjarへのパスは、これが機能するために重要なすべてです。実際にはjarはMavenの依存関係ではないため、Mavenに依存関係を扱うように指示するだけです。
Ric Jafe、2015年

1
2016年現在、これは機能していないようです。ビルドはパスを確認しますが、色付きのjarにコードを含めません。ネズミ...
markthegrea 2016

24

プロジェクトの下にリポジトリフォルダを作成します。とりましょう

${project.basedir}/src/main/resources/repo

次に、カスタムjarをこのリポジトリにインストールします。

mvn install:install-file -Dfile=[FILE_PATH] \
-DgroupId=[GROUP] -DartifactId=[ARTIFACT] -Dversion=[VERS] \ 
-Dpackaging=jar -DlocalRepositoryPath=[REPO_DIR]

最後に、次のリポジトリと依存関係の定義をプロジェクトpom.xmlに追加します。

<repositories>
    <repository>
        <id>project-repo</id>
        <url>file://${project.basedir}/src/main/resources/repo</url>
    </repository>
</repositories>

<dependencies>    
    <dependency>
        <groupId>[GROUP]</groupId>
        <artifactId>[ARTIFACT]</artifactId>
        <version>[VERS]</version>
    </dependency>
</dependencies>

1
これは私にとって非常にうまくいきました。PS「src」内に置くのが適切ではないように思われるため、ローカルリポジトリには別のディレクトリをお勧めします(ソースではありません!)
davidfrancis

1
それは魅力のように働きました。古いプロジェクトをAntからMavenに移行していますが、Webリポジトリにないライブラリがいくつかあります。
パウロペドロソ2017年

注意:-DlocalRepositoryPathの値が末尾にない/(つまり、フォルダーを示す)場合、彼はgroupId でリポジトリを作成します。例:グループIDがfoo.comでlocalRepositoryPathがのrepo場合、リポジトリフォルダーはになりrepo.foo.comます。
Sheshadri Mantha 2017年

この手順は、主にJavaプロジェクトとファイルシステムに使用されるMavenビルド自動化ツールを使用したシステムリポジトリ管理のローカルプロジェクトです。
Oleksii Kyslytsyn

8

このようなライブラリをホストするローカルリポジトリをセットアップする必要があります。まさにそれを行う多くのプロジェクトがあります。たとえばArtifactory


4
用語のポイントは、ローカルのリポジトリではなく、内部のリモートリポジトリです。ローカルリポジトリは、ローカルファイルシステムの依存関係がダウンロードされるリポジトリです。
リッチセラー、

3

Jenkinsビルドを使用している場合、どのソリューションも機能しません!! Jenkinsビルドサーバー内でpomを実行すると、Jenkins run pomがエンタープライズリポジトリからこれらのファイルをダウンロードしようとするため、これらのソリューションは失敗します。

jarをsrc / main / resources / libの下にコピーします(libフォルダーを作成します)。これらはプロジェクトの一部であり、展開サーバーに至るまで続きます。デプロイメントサーバーで、起動スクリプトのクラスパスにsrc / main / resources / lib / *が含まれていることを確認します。ビオラ。


2

これらをプライベートなローカルリポジトリ(たとえば、ホームディレクトリの下の.m2 / repository)にインストールできます。詳細はこちら


7
はい、それは可能ですが、プロジェクトを構築するすべての人に、ファイルX、YをディレクトリZに配置する必要があり、それによって事態が複雑になることを伝える必要があります。結局、ビルドプロセスを簡略化するためにMavenを使用したいと思います。
samson

2

私がよく理解している場合、コンパイル段階で依存関係をエクスポートして、必要な各ライブラリを手動で取得する必要がない場合は、mojo copy-dependenciesを使用できます

それがあなたの場合に役立つことを願っています(


2

@Ric Jafeのソリューションが私にとってうまくいきました。

これはまさに私が探していたものです。研究テストコードのためにそれをプッシュする方法。派手なものは何もありません。ええ、私はそれが彼らすべてが言うことだと知っています:)さまざまなmavenプラグインソリューションは私の目的にとってやり過ぎであるようです。いくつかのjarファイルがあり、それらはpomファイルを含むサードパーティライブラリとして提供されています。すばやくコンパイル/実行したい。私がpythonにさりげなく適応させたこのソリューションは、私にとって不思議に働いた。私のポンポンに切り貼りしました。このタスクのPython / PerlコードはこのQ&A にあります。jarをインストールせずにmaven 2ビルドクラスパスに追加できますか?

def AddJars(jarList):
  s1 = ''
  for elem in jarList:
   s1+= """
     <dependency>
        <groupId>local.dummy</groupId>
        <artifactId>%s</artifactId>
        <version>0.0.1</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/manual_jars/%s</systemPath>
     </dependency>\n"""%(elem, elem)
  return s1

上記のソリューションは、xx.jarの 'dependencies.dependency.systemPath'を返しますが、プロジェクトディレクトリ内のファイルを指すべきではありません。stackoverflow.com/questions/10935135/…を
sarah.ferguson


1

インストールだけではうまくいきませんでした。

mvn deploy:deploy-file -Durl=file:///home/me/project/lib/ \
  -Dfile=target/jzmq-2.1.3-SNAPSHOT.jar -DgroupId=org.zeromq \  
  -DartifactId=zeromq -Dpackaging=jar -Dversion=2.1.3
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.