Maven:カスタム外部JARをプロジェクトにリンクする最良の方法?


151

Mavenを学ぶのは私の最初の数日であり、私はまだ基​​本に苦労しています。プロジェクトで参照する必要のある外部.jarファイル(パブリックリポジトリでは使用不可)があり、自分の最善のオプションを理解しようとしています。

これは、ライブラリ用の中央リポジトリのない小規模なプロジェクトであるため、ローカルリポジトリ(どういうわけかソース管理に追加され、そのように機能するはずかどうかわからない)か、.jarを次の場所に保存する必要があります。公式リポジトリ外のディスク。

1)プロジェクトとライブラリの両方をソース管理にしたい場合、majarを使用してプロジェクトの参照に.jarファイルを追加するための最良のオプションは何ですか?

2)それでもEclipseに依存関係を表示させることができないようです。手動でpomのセクションに追加したところ、m2eclipseの依存関係リストに問題なく表示されました。mvn compileとmvn packageはどちらも成功しますが、プログラムを実行すると次のようになります。

Exception in thread "main" java.lang.Error: Unresolved compilation problems:
        LibraryStuff cannot be resolved to a type

これは、POMを次のように編集した後です。

<dependency>
  <groupId>stuff</groupId>
  <artifactId>library</artifactId>
  <version>1.0</version>
  <systemPath>${lib.location}/MyLibrary.jar</systemPath>
  <scope>system</scope>
</dependency>

上記のようにpom.xmlをすでに編集していても、mvn install:install-fileを実行する必要がありますか?

ありがとう!

回答:


67

使うべきだと思います mvn install:install-fileローカルリポジトリにライブラリjarを入力するするその後、スコープをシステムからコンパイルに変更する必要があります。

Mavenを使用している場合は、IDEプラグインではなく、Mavenを直接使用することをお勧めします。これにより、複雑さがさらに増します。

エラーについては、必要なjarをクラスパスに配置していますか?ライブラリの型を使用している場合は、ランタイムでもその型にアクセスできる必要があります。これはmaven自体とは関係ありません。

ライブラリをソース管理にしたい理由がわかりません。これはバイナリコードではなくソースコード用です。


36
詳細については、mkyong.commvn install::install-file / maven
Doug T.

7
mvn install::install-fileローカルリポジトリで使用すると、ソースコードのクローンを作成するすべてのユーザーがこの手動の手順も実行する必要があります。それ以外の場合、ビルドはそのままで壊れます
Isen Ng

ただし、jarはwarファイルに追加されません。
プラチ

207

プロジェクト内リポジトリを作成できるため、run mvn install:install-file新しいコンピュータで作業するたびに作業する必要はありません

<repository>
    <id>in-project</id>
    <name>In Project Repo</name>
    <url>file://${project.basedir}/libs</url>
</repository>

<dependency>
    <groupId>dropbox</groupId>
    <artifactId>dropbox-sdk</artifactId>
    <version>1.3.1</version>
</dependency>

/groupId/artifactId/version/artifactId-verion.jar

詳細はこのブログ投稿を読んでください

https://web.archive.org/web/20121026021311/charlie.cu.cc/2012/06/how-add-external-libraries-maven


2
上記のソリューションを使用すると、「mvn clean package」の実行中に警告が表示されました-プロジェクト<dependency_name>のPOMがありません。依存関係情報はありません。
Jignesh Gohel 14

これは、jarファイルを1つまたはいくつか追加する必要がある場合に最適なソリューションです。ありがとう。
Antonio Sesto 2014年


2
file:// $ {project.basedir} / libsの代わりにfile:/// $ {project.basedir} / libs(3つのスラッシュ)を使用する必要があった
Loc Phan

2
インストールされているjarがMavenコンパイル済みjarではない場合、メタデータを定義するために新しいpomファイルを追加する必要もあります。これらの手動によるトラブルをすべて回避するためにmvn install:install-file、ディレクトリ構造全体を使用して、ローカルリポジトリからプロジェクト内リポジトリにコピーすることをお勧めします。
Isen Ng 2017年

33

これは、<dependency>要素内にネストされた<scope>要素を使用することで簡単に実現できます。

例えば:

 <dependencies>
   <dependency>
     <groupId>ldapjdk</groupId>
     <artifactId>ldapjdk</artifactId>
     <scope>system</scope>
     <version>1.0</version>
     <systemPath>${basedir}\src\lib\ldapjdk.jar</systemPath>
   </dependency>
 </dependencies>

リファレンス:http : //www.tutorialspoint.com/maven/maven_external_dependencies.htm


この方法は、Eclipse Embedded Mavenしかなく、インストールプラグイン(オフラインシステム)がない場合に非常にうまく機能するためinstall、依存しているプロジェクトでゴールを実行することはできません。多くの場合、エアギャップシステムとインストールプラグイン以外のすべてのプラグインを使用することは、非常にまれな状況です。
Cardin Lee JH 2018年

1
最もクリーンで簡単です。
Ajay Kumar

$ {basedir} \ src \ lib \ ldapjdk.jarパスを他のフォルダーで1レベル上げるように、$ {project.basedir}フォルダーの外にあるローカル依存関係パスを追加する方法
Naveen Kumar

私はエラーを取得しています-"The POM for … is missing, no dependency information available” even though it exists in Maven Repository
garg10may

28

Mavenのマニュアルこれを行うように言っています:

mvn install:install-file -Dfile=non-maven-proj.jar -DgroupId=some.group -DartifactId=non-maven-proj -Dversion=1 -Dpackaging=jar

4
このコマンドは、libをmavenリポジトリにインストールします。これの欠点は、別のコンピューターのプロジェクトで作業しようとすると、もう一度実行する必要があることです。
Charlie Wu

25

updateそれ以来、独自のNexusサーバーをインストールしました。

私たちの会社では、いくつかのjarがありましたが、それらは一般的ですが、mavenリポジトリーでホストされていなかったため、ローカルストレージに保存したくありませんでした。我々は非常に単純なMVN(パブリック)のGithub上のレポを作成した(しかし、あなたは、任意のサーバー上またはローカルにホストすることができます):
ノートこれは少数めったにchaningないjarファイルを管理するための唯一の理想的であること

  1. GitHubにリポジトリを作成します。
    https://github.com/<user_name>/mvn-repo/

  2. pom.xmlにリポジトリを追加します
    (フルパスのrawファイルはリポジトリ名とは少し異なることに注意してください)

    <repository>
        <id>project-common</id>
        <name>Project Common</name>
        <url>https://github.com/<user_name>/mvn-repo/raw/master/</url>
    </repository>
  3. ホスト(Githubまたはプライベートサーバー)に依存関係を追加します
    あなたが知る必要があるのは、ファイルが@glitch
    /groupId/artifactId/version/artifactId-version.jar
    bによって言及されたパターンで保存されていることだけです。ホストで、このパターンに一致するフォルダーを作成します。
    つまり、という名前のjarファイルがある場合はservice-sdk-0.0.1.jar、フォルダーservice-sdk/service-sdk/0.0.1/を作成し、service-sdk-0.0.1.jarそこにjarファイルを配置します。
    c。ブラウザからjarをダウンロードしてテストします(この場合:https://github.com/<user_name>/mvn-repo/raw/master/service-sdk/service-sdk/0.0.1/service-sdk-0.0.1.jar

  4. pom.xmlファイルに依存関係を追加します。

    <dependency>
        <groupId>service-sdk</groupId>
        <artifactId>service-sdk</artifactId>
        <version>0.0.1</version>
    </dependency>
  5. 楽しい


いいですね。これは私が見つけた中で最もスケーラブルなソリューションです。ありがとう
Charlie Wu

11

systemPathは使用しないでください。ここで人々が言っ​​たこととは逆に、チェックアウトしたプロジェクトディレクトリの下のフォルダーに外部jarを配置して、Mavenが他の依存関係と同じように見つけることができます。ここに2つの重要なステップがあります:

  1. -DlocalRepositoryPathを指定して「mvn install:install-file」を使用します。
  2. POMでそのパスを指すようにリポジトリーを構成します。

それはかなり簡単で、ステップバイステップの例がここにあります:http : //randomizedsort.blogspot.com/2011/10/configuring-maven-to-use-local-library.html


8

Mavenプロジェクトに非Maven jarを追加するMavenの方法

Mavenプロジェクトと非Maven jar

ビルドセクションにMavenインストールプラグインを追加する

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-install-plugin</artifactId>
        <version>${version.maven-install-plugin}</version>
        <executions>

            <execution>
                <id>install-external-non-maven1-jar</id>
                <phase>clean</phase>
                <configuration>
                    <repositoryLayout>default</repositoryLayout>
                    <groupId>jar1.group</groupId>
                    <artifactId>non-maven1</artifactId>
                    <version>${version.non-maven1}</version>
                    <file>${project.basedir}/libs/non-maven1.jar</file>
                    <packaging>jar</packaging>
                    <generatePom>true</generatePom>
                </configuration>
                <goals>
                    <goal>install-file</goal>
                </goals>
            </execution>
            <execution>
                <id>install-external-non-maven2-jar</id>
                <phase>clean</phase>
                <configuration>
                    <repositoryLayout>default</repositoryLayout>
                    <groupId>jar2.group</groupId>
                    <artifactId>non-maven2</artifactId>
                    <version>${version.non-maven2}</version>
                    <file>${project.basedir}/libs/non-maven2.jar</file>
                    <packaging>jar</packaging>
                    <generatePom>true</generatePom>
                </configuration>
                <goals>
                    <goal>install-file</goal>
                </goals>
            </execution>
            <execution>
                <id>install-external-non-maven3-jar</id>
                <phase>clean</phase>
                <configuration>
                    <repositoryLayout>default</repositoryLayout>
                    <groupId>jar3.group</groupId>
                    <artifactId>non-maven3</artifactId>
                    <version>${version.non-maven3}</version>
                    <file>${project.basedir}/libs/non-maven3.jar</file>
                    <packaging>jar</packaging>
                    <generatePom>true</generatePom>
                </configuration>
                <goals>
                    <goal>install-file</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

依存関係を追加する

<dependencies>
    <dependency>
        <groupId>jar1.group</groupId>
        <artifactId>non-maven1</artifactId>
        <version>${version.non-maven1}</version>
    </dependency>
    <dependency>
        <groupId>jar2.group</groupId>
        <artifactId>non-maven2</artifactId>
        <version>${version.non-maven2}</version>
    </dependency>
    <dependency>
        <groupId>jar3.group</groupId>
        <artifactId>non-maven3</artifactId>
        <version>${version.non-maven3}</version>
    </dependency>
</dependencies>

参考資料注私はブログの所有者です


jarのバージョンとmavenインストールプラグインのバージョンを知るにはどうすればよいですか?
osk

瓶のバージョンはちょうど作られ、プラグインのバージョンをインストールしますMavenの最新のものです
craftsmannadeem

7

同じ問題が発生し、spring-boot v1.4 +を使用している場合は、この方法で実行できます。

includeSystemScopeがあります。あなたがジャーにシステム・スコープの依存関係を追加するために使用できることを。

例えば

プロジェクトにoracleドライバーを使用しています。

<dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc14</artifactId>
        <version>10.2.0.3.0</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/src/main/resources/extra-jars/ojdbc14-10.2.0.3.0.jar</systemPath>
    </dependency>

次にincludeSystemScope = trueにして、jarをパス/ BOOT-INF / lib / **に含めます。

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <includeSystemScope>true</includeSystemScope>
    </configuration>
</plugin>

重複したインクルードを避けるためにリソースから除外します。jarは十分に太いです〜

<build>
    <testSourceDirectory>src/test/java</testSourceDirectory>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <excludes>
                <exclude>**/*.jar</exclude>
            </excludes>
        </resource>
    </resources>
</build>

幸運を!


私はこのような解決策を探していました。それは、新しい開発者が到着したときに、これによりインストール手順が簡略化されるためです。アーティファクトサーバーがない場合は、プロジェクトにカスタム依存関係を持たせる方が簡単です。また、CIを使用する場合、このソリューションでは、jarをCIサーバーに手動でインストールする必要がありません。
Dalc、

複数の瓶はどうですか?
mithun_ghose

4

systemPathを変更します。

<dependency>
  <groupId>stuff</groupId>
  <artifactId>library</artifactId>
  <version>1.0</version>
  <systemPath>${project.basedir}/MyLibrary.jar</systemPath>
  <scope>system</scope>
</dependency>

3

pom.xmlはローカルリポジトリを調べて、アーティファクトに一致する依存関係を見つけようとします。また、システムスコープまたはsystemPath属性を実際に使用するべきではありません。これらは通常、JREではなく、JDKにあるもののために予約されています。

Mavenアーティファクトのインストール方法については、この質問を参照してください。


3

使用するすべての例に注意してください

<repository>...</respository> 

アウターが必要

<repositories>...</repositories> 

囲みタグ。いくつかの例からは明らかではありません。


2

ここでの最善の解決策は、リポジトリをインストールすることです:NexusまたはArtifactory。もしあなたがこのようなものを置く場所を与えてくれ、さらにそれは外部からあなたのものをキャッシュすることによって物事をスピードアップします。

あなたが扱っているものがオープンソースであるなら、あなたは中央に置くことも検討するかもしれません。

ガイドを参照してください


1

Eclipse Oxygenを使用すると、以下のことを実行できます。

  1. ライブラリをWEB-INF / libに配置します
  2. プロジェクト->ビルドパスの構成->ライブラリの追加-> Webアプリライブラリ

Mavenは、プロジェクトのインストール時にそれらを取得します。


3
もしそうなら、私のプロジェクトを引っ張る他のユーザーはEclipseで同じことをしなければならないのですか?
cruxi

0

外部jarがMavenプロジェクトによってのみ作成されている場合、プロジェクト全体をシステムにコピーして、

mvn install

プロジェクトディレクトリ。これにより、jarがローカルのmavenリポジトリである.m2ディレクトリに追加されます。

これで、

<dependency>
     <groupId>copy-from-the=maven-pom-of-existing-project</groupId>
     <artifactId>copy-from-the=maven-pom-of-existing-project</artifactId>
     <version>copy-from-the=maven-pom-of-existing-project</version>
</dependency>

これにより、

mvn exec:java 

動作します。ここで提案を使用する場合

<scope>system</scope>

次に、コマンドラインからの実行を使用しながら、クラスを個別に追加する必要があります。

ここで説明する次のコマンドで外部jarを追加できます

mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> \
-DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>

0

この問題に対処するために私が見つけた最も効率的でクリーンな方法は、Githubパッケージを使用することです

  1. 外部jarをパブリックにホストするかどうかに応じて、GitHub上に単純な空のパブリック/プライベートリポジトリを作成します。

  2. 以下のmavenコマンドを実行して、上記で作成したgithubリポジトリに外部jarをデプロイします

    mvn deploy:deploy-file \ -DgroupId= your-group-id \ -DartifactId= your-artifact-id \ -Dversion= 1.0.0 -Dpackaging= jar -Dfile= path-to-file \ -DrepositoryId= id-to-map-on-server-section-of-settings.xml \ -Durl=https://maven.pkg.github.com/github-username/github-reponame-created-in-above-step

    上記のコマンドを実行すると、で説明されているGitHubリポジトリに外部jarがデプロイされます-Durl=。依存関係をGitHubパッケージとしてデプロイする方法のこのリンクを参照できます。GitHubパッケージのデプロイチュートリアル

  3. その後、あなたは使用して依存関係を追加することができgroupIdartifactIdおよびversionMavenの中に上記のステップで言及pom.xmlして実行mvn install

  4. MavenはGitHub Packagesレジストリから外部jarの依存関係をフェッチし、mavenプロジェクトに提供します。

  5. これを機能させるにはsettings.xml、GitHubパッケージレジストリからフェッチするようにMavenを設定する必要もあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.