web-dev-qa-db-ja.com

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

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

ライブラリの中央リポジトリがない小規模プロジェクトなので、ローカルリポジトリ(何らかの方法でソース管理に追加され、そのように動作するかどうかわからない)または.jarを保存する必要があります正式なリポジトリの外部にあるディスク。

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

2)Eclipseに依存関係を認識させることはまだできないようです。 pomのセクションに手動で追加しましたが、m2EclipseのDependenciesリストに表示されます。 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を実行する必要がありますか?

ありがとう!

130

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

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

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

ライブラリをソース管理に配置する理由がわかりません。バイナリjarではなくソースコード用です。

58
stalker

プロジェクトリポジトリに作成できるので、新しいコンピューターで作業するたびに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

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

http://charlie.cu.cc/2012/06/how-add-external-libraries-maven/

189
Charlie Wu

これは、<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

27
Jignesh Gohel

Mavenマニュアル やること これ:

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

更新独自のNexusサーバーをインストールしたばかりで、はるかに簡単でクリーンです。

私たちの会社では、いくつかのjarファイルがありましたが、いくつかのjarファイルは一般的ですが、Mavenリポジトリでホストされておらず、ローカルストレージに保存する必要もありませんでした。 Githubに非常に単純なmvn(パブリック)リポジトリを作成しました(ただし、任意のサーバーまたはローカルでホストできます)。
noteこれはごくまれに管理するのに理想的ですjarファイルの変更

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

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

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

22
Kenny Cason

SystemPathを使用しないでください。ここで人々が言っ​​たことに反して、チェックアウトしたプロジェクトディレクトリの下のフォルダーに外部jarを配置し、Mavenが他の依存関係のようにそれを見つけることができます。 2つの重要な手順を次に示します。

  1. -mlocal install:install-fileを-DlocalRepositoryPathとともに使用します。
  2. POMでそのパスを指すようにリポジトリを構成します。

それはかなり簡単で、ステップバイステップの例をここで見つけることができます: http://randomizedsort.blogspot.com/2011/10/configuring-maven-to-use-local-library.html =

11
Nehc

非Maven jarをMavenプロジェクトに追加する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>

参照 注:私はブログの所有者です

6
craftsmannadeem

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

includeSystemScopeがあり、これを使用してシステムスコープの依存関係をjarに追加できます。

例えば.

プロジェクトに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>

がんばろう!

4
chendu

systemPathを変更します。

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

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

<repository>...</respository> 

アウターが必要

<repositories>...</repositories> 

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

3
user3897528

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

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

3
Tim Sparg

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

扱っているものがオープンソースの場合、puttingin centralを検討することもできます。

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

2
bmargulies

Eclipse Oxygenを使用すると、次のことができます。

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

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

1
Rick

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

mvn install

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

今、あなたは追加することができます

<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
Bug Killer