web-dev-qa-db-ja.com

インストールしなくても、maven 2ビルドクラスパスにjarを追加できますか?

Maven2は実験中/開発の迅速で汚いモックアップ段階で私を夢中にさせています。

使用したいWebアプリケーションフレームワークの依存関係を定義するpom.xmlファイルがあり、そのファイルからすばやくスタータープロジェクトを生成できます。しかし、pom.xmlファイルがまだ定義されていないサードパーティーのライブラリにリンクしたい場合があるので、サードパーティーのlib用のpom.xmlファイルを手動で作成してインストールし、私のpom.xmlに依存関係を追加します。 「私が定義した依存関係に加えて、/libにあるjarも含めます」とMavenに伝えたいだけです。

これは単純なはずですが、もしそうであれば、私は何かが足りません。

これを行う方法についてのすべてのポインターは大歓迎です。それにもかかわらず、mavenを/libディレクトリにポイントし、すべての囲まれたjarファイルを単一の依存関係にマップしたpom.xmlを簡単に作成する簡単な方法があれば、それを命名/インストールおよびリンクできます。

674
purple

一般的なアプローチの問題

インターネット上で見つかる答えのほとんどは、あなたのローカルリポジトリに依存関係をインストールするか、pomで "system"スコープを指定し、あなたのプロジェクトのソースと一緒に依存関係を配布することをあなたに勧めます。しかし、これらの解決策はどちらも実際には欠陥があります。

"Install to Local Repo"アプローチを適用してはいけない理由

ローカルリポジトリに依存関係をインストールしても、そこに残ります。このリポジトリにアクセスできる限り、配布アーティファクトは問題ありません。問題は、ほとんどの場合、このリポジトリはローカルマシンに存在するため、他のマシンへの依存関係を解決する方法はないでしょう。アーティファクトを特定のマシンに依存させることは、物事を処理する方法ではありません。そうでなければ、この依存関係は、そのプロジェクトで動作しているすべてのマシンにローカルにインストールする必要があります。

なぜあなたは「システムスコープ」アプローチを適用すべきでない

「システムスコープ」のアプローチであなたが依存するjarファイルは、どのリポジトリにもインストールされることも、あなたのターゲットパッケージに添付されることもありません。だからこそ、あなたのディストリビューションパッケージは使われたときにその依存関係を解決する方法を持っていないでしょう。私が信じているのは、システムスコープの使用が非推奨になった理由でもあります。とにかく、廃止予定の機能に頼りたくないでしょう。

静的プロジェクト内リポジトリソリューション

これをpomに入れた後:

<repository>
    <id>repo</id>
    <releases>
        <enabled>true</enabled>
        <checksumPolicy>ignore</checksumPolicy>
    </releases>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
    <url>file://${project.basedir}/repo</url>
</repository>

グループIDがx.y.zの各案件について、Mavenは案件の検索にプロジェクトディレクトリ内の次の場所を含めます。

repo/
| - x/
|   | - y/
|   |   | - z/
|   |   |   | - ${artifactId}/
|   |   |   |   | - ${version}/
|   |   |   |   |   | - ${artifactId}-${version}.jar

これについてもっと詳しく述べるには、 このブログ記事 を読むことができます。

Mavenを使用してプロジェクトリポジトリにインストールする

手作業でこの構造を作成する代わりに、Mavenプラグインを使用してあなたのjarファイルを成果物としてインストールすることをお勧めします。そのため、repoフォルダーの下のプロジェクト内リポジトリーに成果物をインストールするには、次のコマンドを実行します。

mvn install:install-file -DlocalRepositoryPath=repo -DcreateChecksum=true -Dpackaging=jar -Dfile=[your-jar] -DgroupId=[...] -DartifactId=[...] -Dversion=[...]

この方法を選択した場合、pomのリポジトリ宣言を単純化して以下のことが可能になります。

<repository>
    <id>repo</id>
    <url>file://${project.basedir}/repo</url>
</repository>

ヘルパースクリプト

Libごとにインストールコマンドを実行するのはちょっと面倒で間違いなく間違いが起こりやすいので、すべてのメタデータ(groupId、artifactId)を自動的に解決しながら、libフォルダからプロジェクトリポジトリにすべてのjarを自動的にインストールする ユーティリティスクリプト を作成しました。など)ファイルの名前から。このスクリプトは、あなたのpomにコピー&ペーストするための依存関係xmlも出力します。

ターゲットパッケージに依存関係を含める

プロジェクト内リポジトリを作成したら、プロジェクトのソースとの依存関係を配布するという問題は解決されていますが、それ以降、プロジェクトのターゲットアーティファクトは公開されていないjarファイルに依存します。リポジトリに保存すると、解決できない依存関係が発生します。

この問題を克服するために、ターゲットパッケージにこれらの依存関係を含めることをお勧めします。これは Assembly Plugin または OneJar Plugin のどちらでも可能です。 OneJarの公式ドキュメンテーションは簡単に把握できます。

577
Nikita Volkov

コードを捨てる場合のみ

scope == systemを設定し、groupId、artifactId、およびversionを作成するだけです。

<dependency>
    <groupId>org.swinglabs</groupId>
    <artifactId>swingx</artifactId>
    <version>0.9.2</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/swingx-0.9.3.jar</systemPath>
</dependency>

注:システムの依存関係は結果のjar/warにコピーされません
mavenを使用して構築されたシステム依存関係を戦争に含める方法 を参照)

468
Pyrolistical

あなたのプロジェクトにローカルリポジトリを作成することができます

たとえば、プロジェクト構造にlibsフォルダがあるとします。

  • libsフォルダーには、次のようなディレクトリー構造を作成する必要があります。/groupId/artifactId/version/artifactId-version.jar

  • Pom.xmlにリポジトリを登録する必要があります

    <repository>
        <id>ProjectRepo</id>
        <name>ProjectRepo</name>
        <url>file://${project.basedir}/libs</url>
    </repository>
    
  • そしていつものように依存関係を追加する

    <dependency>
        <groupId>groupId</groupId>
        <artifactId>artifactId</artifactId>
        <version>version</version>
    </dependency>
    

それがすべてです。

詳細な情報: Mavenに外部ライブラリを追加する方法

53

注:システムスコープ( このページで説明されているように )を使用する場合、Mavenには絶対パスが必要です。

Jarファイルがプロジェクトのルートの下にある場合は、systemPath値の先頭に$ {basedir}を付けます。

31
Ed Brannin

あなたは本当にリポジトリを通してフレームワークを整備し、あなたの依存関係を前もって識別するべきです。システムスコープを使用することは、「依存関係管理を気にかけない」という理由で、よく使用される間違いです。問題は、これを行うと、通常の状態ではMavenが表示されない、倒錯したMavenビルドになってしまうことです。 this のようなアプローチに従うことをお勧めします。

14
Brian Fox

これは私がやったことです、それはまたパッケージの問題を回避し、それはチェックアウトされたコードで動作します。

repoを使用した私の場合は、プロジェクト内に新しいフォルダーを作成しましたが、src/repoを自由に使用してください

私のPOMには、どのパブリックMavenリポジトリにもない依存関係がありました

<dependency>
    <groupId>com.dovetail</groupId>
    <artifactId>zoslog4j</artifactId>
    <version>1.0.1</version>
    <scope>runtime</scope>
</dependency>

それから私は次のディレクトリrepo/com/dovetail/zoslog4j/1.0.1を作成し、JARファイルをそのフォルダにコピーしました。

私は、ダウンロードしたファイルを表すために次のPOMファイルを作成しました(このステップはオプションですが、WARNINGを取り除きます)。

<?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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.dovetail</groupId>
    <artifactId>zoslog4j</artifactId>
    <packaging>jar</packaging>
    <version>1.0.1</version>
    <name>z/OS Log4J Appenders</name>
    <url>http://dovetail.com/downloads/misc/index.html</url>
    <description>Apache Log4j Appender for z/OS Logstreams, files, etc.</description>
</project>

私が作成した2つのオプションのファイルは、POM用のSHA1チェックサムと、チェックサムがないという警告を削除するためのJARです。

shasum -b < repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.jar \
          > repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.jar.sha1

shasum -b < repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.pom \
          > repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.pom.sha1

最後に、ローカルリポジトリを参照できるようにするために、pom.xmlに次のフラグメントを追加します。

<repositories>
    <repository>
        <id>project</id>
        <url>file:///${basedir}/repo</url>
    </repository>
</repositories>
13

Mavenインストールプラグイン ローカルリポジトリにjarをインストールするためのコマンドライン使用法があります。POMはオプションですが、GroupId、ArtifactId、Version、およびPackaging(すべてのPOMのもの)を指定する必要があります。

12
toad

これがローカルjarの追加またはインストール方法です

    <dependency>
        <groupId>org.example</groupId>
        <artifactId>iamajar</artifactId>
        <version>1.0</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/lib/iamajar.jar</systemPath>
    </dependency>

必須であるため、デフォルトのgroupIdとartifactIdを指定しました。

10

私はこれを行うための別の方法を見つけました、 Herokuの投稿からここに見なさい

要約するには(コピー&ペーストについてはごめんなさい)

  • ルートフォルダの下にrepoディレクトリを作成します。
 yourproject 
 +  -  pom.xml 
 +  -  src 
]  -   - レポ
  • これを実行してjarファイルをローカルのリポジトリディレクトリにインストールします。
 mvn deploy:deploy-file -Durl = file:/// path/to/yourproject/repo/-Dfile = mylib-1.0.jar -DgroupId = com.example -DartifactId = mylib -Dpackaging = jar  - Dversion = 1.0 
  • これをあなたのpom.xmlに追加してください:
<repositories>
    <!--other repositories if any-->
    <repository>
        <id>project.local</id>
        <name>project</name>
        <url>file:${project.basedir}/repo</url>
    </repository>
</repositories>


<dependency>
    <groupId>com.example</groupId>
    <artifactId>mylib</artifactId>
    <version>1.0</version>  
</dependency>
8
xbeta

<scope>system</scope>を使用することは、他の人が説明する理由のためひどいアイデアです。ローカルリポジトリに手動でファイルをインストールすると、ビルドが再現できなくなります。また、<url>file://${project.basedir}/repo</url>整形式のfile URL(たとえば、プロジェクトが異常な文字を含むディレクトリでチェックアウトされている場合)、(2)このプロジェクトのPOMが他の誰かのプロジェクトの依存関係として使用されている場合、結果は使用できません.

アーティファクトをパブリックリポジトリにアップロードしたくない場合、Simeonのヘルパーモジュールの提案がその役割を果たします。しかし、今はもっと簡単な方法があります…

勧告

non-maven-jar-maven-plugin を使用します。他のアプローチの欠点はなく、まさにあなたが求めていたものを実行します。

8
Jesse Glick

CloudBeesの人たちとこのような種類のJARの適切にパッケージ化されたパッケージングについて非常に長い議論をした後、彼らは解決策のための興味深い良い提案をしました:

既存のJARを主要な成果物としてアタッチする偽のMavenプロジェクトの作成。POMのインストールに属しています。インストールファイルの実行。これはPOMのそのような親族の例です:

 <build>
    <plugins>
        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <version>2.3.1</version>
            <executions>
                <execution>
                    <id>image-util-id</id>
                    <phase>install</phase>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                    <configuration>
                        <file>${basedir}/file-you-want-to-include.jar</file>
                        <groupId>${project.groupId}</groupId>
                        <artifactId>${project.artifactId}</artifactId>
                        <version>${project.version}</version>
                        <packaging>jar</packaging>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

しかしそれを実行するためには、既存のプロジェクト構造を変更する必要があります。まず、そのような種類のJARごとに異なる偽のMavenプロジェクト(モジュール)を作成する必要があることに留意する必要があります。そしてすべてのJARラッパーと既存のメインプロジェクトであるすべてのサブモジュールを含む親Mavenプロジェクトを作成する必要があります。構造は次のようになります。

ルートプロジェクト(これには親POMファイルが含まれ、すべてのサブモジュールが モジュール XML要素)(POMパッケージ)

JAR 1ラッパーMavenの子プロジェクト(POMパッケージ)

JAR 2ラッパーMavenの子プロジェクト(POMパッケージ)

主な既存のMaven子プロジェクト(WAR、JAR、EAR ....パッケージ化)

Mvn:installまたはmvn:packagesで実行されている親が強制され、サブモジュールが実行されます。プロジェクト構造を変更する必要があるため、これはマイナスの点として懸念される可能性がありますが、最後には静的でないソリューションを提供します。

6
Simeon Angelov

systemPathの問題は、依存関係のjarファイルがあなたの成果物に沿って推移的な依存関係として分散されないことです。私がここに投稿したものを試してください: プロジェクトのjarファイルをMavenizeするか、それをWEB-INF/libに入れるのが最善ですか?

その後、通常どおり依存関係を宣言します。

そしてフッターノートを読んでください。

4
mschonaker

あなたが迅速で汚い解決策を望むなら、あなたは以下をすることができます(私はテストプロジェクト以外にはこれをお勧めしませんが、Mavenはこれが適切ではないと長々と不平を言います)。

必要なjarファイルごとに、可能であればPerlスクリプトなどを使って依存関係エントリを追加し、それをコピーしてpomファイルに貼り付けます。

#! /usr/bin/Perl

foreach my $n (@ARGV) {

    [email protected]*/@@;

    print "<dependency>
    <groupId>local.dummy</groupId>
    <artifactId>$n</artifactId>
    <version>0.0.1</version>
    <scope>system</scope>
    <systemPath>\${project.basedir}/lib/$n</systemPath>
</dependency>
";
3
Alex Lehmann

A クイック&ダーティー バッチソリューション(Alexの回答に基づく):

libs.bat

@ECHO OFF
FOR %%I IN (*.jar) DO (
echo ^<dependency^>
echo ^<groupId^>local.dummy^</groupId^>
echo ^<artifactId^>%%I^</artifactId^>
echo ^<version^>0.0.1^</version^>
echo ^<scope^>system^</scope^>
echo ^<systemPath^>${project.basedir}/lib/%%I^</systemPath^>
echo ^</dependency^>
)

libs.bat > libs.txtのように実行してください。次にlibs.txtを開き、その内容を依存関係としてコピーします。

私の場合、私は自分のコードをコンパイルするためにライブラリだけを必要としていましたが、この解決策がその目的に最適でした。

3
lmiguelmh

私にとって最も簡単に思えるのは、あなたのカスタムjarを含むようにあなたのmaven-compiler-pluginを設定することです。この例では、libディレクトリ内のすべてのjarファイルをロードします。

        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <includes>
                    <include>lib/*.jar</include>
                </includes>
            </configuration>
        </plugin>
3
realgt

Mavenリポジトリにないサードパーティのjarファイルをインストールするには、maven-install-pluginを使用してください。

以下が手順です。

  1. ソースからjarファイルを手動でダウンロードする(Webサイト)
  2. フォルダを作成し、そこにあなたのjarファイルを置きます
  3. 下記のコマンドを実行して、ローカルのMavenリポジトリにサードパーティのjarファイルをインストールします。

mvn install:インストールファイル-Dfile = -DgroupId = -DartifactId = -Dversion = -Dpackaging =

下記は、私がsimonsite log4jに使った例です。

mvn install:インストールファイル-Dファイル=/Users/athanka/git/MyProject /リポジトリ/ log4j-rolling-appender.jar -DgroupId = uk.org.simonsite -DartifactId = log4j-rolling-appender -Dversion = 20150607-2059 Dpackaging = jar

  1. Pom.xmlに以下のような依存関係を含めます

      <dependency> 
            <groupId>uk.org.simonsite</groupId>
            <artifactId>log4j-rolling-appender</artifactId>
            <version>20150607-2059</version> 
      </dependency>
    
  2. Mvn clean installコマンドを実行してパッケージを作成してください。

以下は参照リンクです:

https://maven.Apache.org/guides/mini/guide-3rd-party-jars-local.html

2
Andrew TR

私が見つけた奇妙な解決策:

eclipseを使う

  • 単純な(非maven)Javaプロジェクトを作成する
  • メインクラスを追加
  • すべてのjarをクラスパスに追加する
  • runnable JARをエクスポートします(これを行うには他に方法がないため重要です)。
  • 生成されたJARに必要なライブラリを抽出する
  • ライセンスの問題を決定する
  • tadammm ...あなたのm2repoに生成されたjarファイルをインストールします
  • この単一の依存関係を他のプロジェクトに追加してください。

歓声、Balint

2
Balint Pato

たとえそれがあなたの問題に正確に合わないとしても、私はこれをここに落とします。私の要求は、

  1. オンラインのmavenリポジトリに見つからないjarファイルはSVNにあるはずです。
  2. ある開発者が別のライブラリを追加した場合、他の開発者はそれらを手動でインストールすることに煩わされるべきではありません。
  3. IDE(私の場合NetBeans)は自動補完とヘルプを提供するためにソースとjavadocを見つけることができるはずです。

最初に(3)についてお話しましょう:IDEはこれを理解できないので、jarをフォルダに入れてどうにかしてそれらを最後のjarにマージするだけではうまくいきません。これはすべてのライブラリが正しくインストールされなければならないことを意味します。しかし、私はみんなに "mvn install-file"を使ってそれをインストールさせたくありません。

私のプロジェクトではメタウィジェットが必要でした。さあ:

  1. 新しいMavenプロジェクトを作成します(「shared-libs」などと名前を付けます)。
  2. メタウィジェットをダウンロードし、Zipをsrc/main/libに展開します。
  3. フォルダdoc/apiには、javadocが含まれています。コンテンツのZipを作成します(doc/api/api.Zip)。
  4. Pomを変更してください このように
  5. プロジェクトをビルドするとライブラリがインストールされます。
  6. ライブラリをプロジェクトへの依存関係として追加するか、(shared-libsプロジェクトに依存関係を追加した場合は)依存関係としてshared-libsを追加して、一度にすべてのライブラリを取得します。

新しいライブラリを作成するたびに、新しい実行を追加して、全員にもう一度プロジェクトを構築するように指示します(プロジェクト階層を使用してこのプロセスを改善できます)。

2
Cephalopod

ここで良い答えを見つけられなかった人たちにとって、これは必要な依存関係をすべて含んだjarファイルを得るために行っていることです。この回答( https://stackoverflow.com/a/7623805/1084306 )はMavenアセンブリプラグインの使用について言及していますが、実際には回答に例を挙げていません。そして、あなたが答えの最後までずっと読んでいなければ(それはかなり長いです)、あなたはそれを見逃すかもしれません。以下をpom.xmlに追加するとtarget/${PROJECT_NAME}-${VERSION}-jar-with-dependencies.jarが生成されます。

        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-Assembly-plugin</artifactId>
            <version>2.4.1</version>
            <configuration>
                <!-- get all project dependencies -->
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <!-- MainClass in mainfest make a executable jar -->
                <archive>
                  <manifest>
                    <mainClass>my.package.mainclass</mainClass>
                  </manifest>
                </archive>

            </configuration>
            <executions>
              <execution>
                <id>make-Assembly</id>
                <!-- bind to the packaging phase -->
                <phase>package</phase> 
                <goals>
                    <goal>single</goal>
                </goals>
              </execution>
            </executions>
        </plugin>
1
Donovan

これはあなたのPOMにそれらを追加する方法に答えません、そして、非常に簡単かもしれませんが、あなたのクラスパスの作業にlibディレクトリを追加するだけでしょうか?私は、Mavenリポジトリに追加したくない外部jarが必要なときにそれを実行することを知っています。

お役に立てれば。

0
javamonkey79

私は@alex lehmann'sからの回答へのコメントでいくつかのPythonコードをほのめかしたので、ここに投稿しています。

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
0
Paul

私たちのプロジェクトでうまくいったのはArchimedes Trajanoが書いたものですが、私たちは.m2/settings.xmlの中に次のようなものを書きました。

 <mirror>
  <id>nexus</id>
  <mirrorOf>*</mirrorOf>
  <url>http://url_to_our_repository</url>
 </mirror>

そして*はcentralに変更する必要があります。それで彼の答えがあなたのために働かないなら、あなたはあなたのsettings.xmlをチェックするべきです

0
Łukasz Klich