web-dev-qa-db-ja.com

Mavenプロジェクトにローカルのjarファイルを追加する方法

ローカルのjarファイル(まだMavenリポジトリの一部ではない)をプロジェクトのライブラリソースに直接追加する方法を教えてください。

942

次のようにJARをローカルのMavenリポジトリにインストールします。

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

それぞれの意味は次のとおりです。

<path-to-file>:ロードするファイルへのパス。例えば→c:\kaptcha-2.3.jar

<group-id>:ファイルが登録されるべきグループ。例:com.google.code

<artifact-id>:ファイルの案件名。例:kaptchaname__

<version>:ファイルのバージョン例→→2.3

<packaging>:ファイルのパッケージ化→jarname__

参照

529
user373455

次のようにローカル依存関係を直接追加することができます( 独自ライブラリを含むmavenプロジェクトの構築 に記載)。

<dependency>
    <groupId>com.sample</groupId>
    <artifactId>sample</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/src/main/resources/yourJar.jar</systemPath>
</dependency>

更新

新しいリリースでは、この機能は廃止予定としてマークされていますが、まだ機能しており、まだ削除されていません(Mavenの起動中にログに警告が表示されるだけです)。この問題についてMavenグループで問題が提起されています https://issues.Apache.org/jira/browse/MNG-6523 (あなたは参加して、この機能が場合によっては有用な理由を説明することができます)。この機能がまだ残っているといいのですが。

あなたが私に尋ねているのであれば、その機能が削除されない限り、私はこれを one naughty jarファイルのみに依存させる リポジトリに収まらない私のプロジェクトで使用します。この機能が削除された場合、まあ、私が後で選ぶことができるたくさんの良い答えがここにあります!

1226
Alireza Fattahi

最初に、私は匿名のStack Overflowユーザーにこの答えを信用したいと思います - 私は以前にここで同様の答えを見たことがあると確信しています - しかし、今それを見つけることができません。

ローカルJARファイルを依存関係として持つための最善の方法は、ローカルMavenリポジトリを作成することです。そのようなリポジトリはpomファイルを含む適切なディレクトリ構造にすぎません。

私の例では:私は${master_project}の場所に私のマスタープロジェクトがあり、subproject1は${master_project}/${subproject1}にあります。

それから私はMavenリポジトリを${master_project}/local-maven-repoに作成します。

Subproject1の${master_project}/${subproject1}/pom.xmlにあるpomファイルでは、URLパスとしてファイルパスをとるリポジトリを指定する必要があります。

<repositories>
    <repository>
        <id>local-maven-repo</id>
        <url>file:///${project.parent.basedir}/local-maven-repo</url>
    </repository>
</repositories>

依存関係は他のリポジトリと同様に指定できます。これはあなたのpomリポジトリを独立させます。たとえば、Maven Centralで目的のJARが利用可能になったら、ローカルリポジトリから削除するだけで、デフォルトのリポジトリから削除されます。

    <dependency>
        <groupId>org.Apache.felix</groupId>
        <artifactId>org.Apache.felix.servicebinder</artifactId>
        <version>0.9.0-SNAPSHOT</version>
    </dependency>

最後に重要なことは、次のように-DlocalRepositoryPathスイッチを使用してJARファイルをローカルリポジトリに追加することです。

mvn org.Apache.maven.plugins:maven-install-plugin:2.5.2:install-file  \
    -Dfile=/some/path/on/my/local/filesystem/felix/servicebinder/target/org.Apache.felix.servicebinder-0.9.0-SNAPSHOT.jar \
    -DgroupId=org.Apache.felix -DartifactId=org.Apache.felix.servicebinder \
    -Dversion=0.9.0-SNAPSHOT -Dpackaging=jar \
    -DlocalRepositoryPath=${master_project}/local-maven-repo

JARファイルをインストールしたら、Mavenリポジトリをコードリポジトリにコミットできます。セットアップ全体はシステムに依存しません。 ( GitHubでの作業例 ).

JARをソースコードリポジトリにコミットすることはお勧めできませんが、実際には、迅速で汚い解決策は、公開できない1つのJARをホストする本格的なNexusリポジトリよりも優れている場合があります。

106
JJ Roman

新しいフォルダを作成し、Mavenプロジェクトのルートにあるlocal-maven-repoとしましょう。

<project>pom.xml内にローカルレポジトリを追加するだけです。

<repositories>
    <repository>
        <id>local-maven-repo</id>
        <url>file:///${project.basedir}/local-maven-repo</url>
    </repository>
</repositories>

次に、インストールしたい外部jarごとに、プロジェクトのルートに移動して次のコマンドを実行します。

mvn deploy:deploy-file -DgroupId=[GROUP] -DartifactId=[ARTIFACT] -Dversion=[VERS] -Durl=file:./local-maven-repo/ -DrepositoryId=local-maven-repo -DupdateReleaseInfo=true -Dfile=[FILE_PATH]
89
Anthony O.
<dependency>
    <groupId>group id name</groupId>
    <artifactId>artifact name</artifactId>
    <version>version number</version>
    <scope>system</scope>
    <systemPath>jar location</systemPath>
</dependency>
24
Satish Karuturi

私はそのような解決策が欲しい - pomファイルでmaven-install-pluginを使う:

        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <version>2.5.2</version>
            <executions>
                <execution>
                    <phase>initialize</phase>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                    <configuration>
                        <file>lib/yourJar.jar</file>
                        <groupId>com.somegroup.id</groupId>
                        <artifactId>artefact-id</artifactId>
                        <version>x.y.z</version>
                        <packaging>jar</packaging>
                    </configuration>
                </execution>
            </executions>
        </plugin>

この場合はmvn initializeを実行することができ、jarはローカルのmavenリポジトリにインストールされます。このjarファイルは、このマシン上の任意のmavenステップで使用可能になりました(<dependency></dependency>タグを持つpomに、他のmaven依存関係と同様にこの依存関係を含めることを忘れないでください)。 jar installをinitializeステップではなく、他の好きなステップにバインドすることもできます。

24
sphinks

はい、できますがそれはお勧めできません。

代わりにこれらすべてのjarファイルをmaven reposにインストールしてください

以下も参照してください

14
Jigar Joshi

1つの方法はそれをあなた自身のMavenリポジトリマネージャ(Nexusなど)にアップロードすることです。とにかく独自のリポジトリマネージャを持つことは良い習慣です。

私が最近見たもう1つのいい方法は、ビルドライフサイクルにMavenインストールプラグインを含めることです。ローカルリポジトリにファイルをインストールするようにPOMで宣言します。それは少し小さいがわずかなオーバーヘッドであり、手動のステップは含まれません。

http://maven.Apache.org/plugins/maven-install-plugin/install-file-mojo.html

8
Puce

POMファイルに独自のローカルJARを追加して、それをMavenビルドで使用します。

mvn install:install-file -Dfile=path-to-jar -DgroupId=owngroupid -DartifactId=ownartifactid -Dversion=ownversion -Dpackaging=jar

例えば:

mvn install:install-file -Dfile=path-to-jar -DgroupId=com.decompiler -DartifactId=jd-core-Java -Dversion=1.2 -Dpackaging=jar

次に、このようにPOMに追加します。

enter image description here

8

本当に速くて汚い方法は、ローカルファイルを指すことです。

<dependency>
      <groupId>sample</groupId>  
       <artifactId>com.sample</artifactId>  
       <version>1.0</version> 
      <scope>system</scope>
      <systemPath>C:\DEV\myfunnylib\yourJar.jar</systemPath>
</dependency>

しかし、これはあなたのマシン上でのみ動作するでしょう(明らかに)。共有するためには、適切なm2アーカイブ(nexus/artifactory)を使うのが普通です、あるいはこれらのどれも持っていないかローカルメーブを設定したくない場合構造化アーカイブを作成して、pom:localに「リポジトリ」を設定します。

<repositories>
    <repository>
        <id>my-local-repo</id>
        <url>file://C:/DEV//mymvnrepo</url>
    </repository>
</repositories>

リモート:

<repositories>
    <repository>
        <id>my-remote-repo</id>
        <url>http://192.168.0.1/whatever/mavenserver/youwant/repo</url>
    </repository>
</repositories>

このため、basedir変数を使用して相対パスも可能です。

<url>file:${basedir}</url>
8
fl0w

もちろん、そのフォルダにjarを追加することもできます。しかし、多分それはあなたが達成したいものではありません...

コンパイルにこれらのjarファイルが必要な場合は、次の関連質問をチェックしてください。 インストールしなくてもmaven 2 build classpathにjarファイルを追加できますか?

また、誰かがそれを提案する前に、システムスコープを使用しないでください。

7
Cephalopod

コマンドライン :

mvn install:install-file -Dfile=c:\kaptcha-{version}.jar -DgroupId=com.google.code
-DartifactId=kaptcha -Dversion={version} -Dpackaging=jar
6
Hassani

もう1つの興味深いケースは、あなたが自分のプロジェクトにプライベートメイバージャーを入れたいときです。推移的な依存関係を解決するためにMavenの機能を維持することをお勧めします。解決策はかなり簡単です。

  1. プロジェクトに libs というフォルダを作成します。
  2. Pom.xmlファイルに次の行を追加します。

    <properties><local.repository.folder>${pom.basedir}/libs/</local.repository.folder>
    </properties>
    
    <repositories>
       <repository>
            <id>local-maven-repository</id>
            <url>file://${local.repository.folder}</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
       </repository>
    </repositories>
    
  3. .m2/repository フォルダーを開き、インポートしたいプロジェクトのディレクトリー構造を libs フォルダーにコピーします。

例えば。依存関係をインポートしたいとします。

<dependency>
    <groupId>com.mycompany.myproject</groupId>
    <artifactId>myproject</artifactId>
    <version>1.2.3</version>
</dependency>

.m2/repository に進むだけで、次のフォルダが表示されます。

com/mycompany/myproject/1.2.3

Libsフォルダ内のすべてのものをコピーし(これも .m2/repository の下のフォルダも含む)、これで完了です。

4
JeanValjean

望ましい方法はあなた自身のリモートリポジトリを作成することでしょう。

やり方の詳細については ここ を見てください。 「 リモートリポジトリへのアップロード 」のセクションを見てください。

3
Simeon

また見てください...

<scope>compile</scope>

Mavenの依存関係 。これがデフォルトですが、場合によってはその範囲を明示的に設定してMavenもローカルリポジトリ内のローカルライブラリを検索することを発見しました。

2
kervin

これは新しいバージョンのための短い構文です:

mvn install:install-file -Dfile=<path-to-file>

JARがApache Mavenによって構築されたときに機能します - 最も一般的なケースです。それから、META-INFディレクトリのサブフォルダにpom.xmlを含みます。これはデフォルトで読み込まれます。

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

2
joro

私はあなたが瓶でいっぱいのフォルダーをアップロードすることができるコードを共有したいです。プロバイダが公開リポジトリを持っておらず、たくさんのライブラリを手動で追加する必要があるときに便利です。 Out of Memoryエラーの可能性があるため、Mavenに直接呼び出すのではなく、.batを作成することにしました。 Windows環境用に準備されていますが、Linux OSに簡単に適応できます。

import Java.io.File;
import Java.io.IOException;
import Java.io.PrintWriter;
import Java.util.Date;
import Java.util.jar.Attributes;
import Java.util.jar.JarFile;
import Java.util.jar.Manifest;

public class CreateMavenRepoApp {

    private static final String OCB_PLUGIN_FOLDER = "C://your_folder_with_jars";

    public static void main(String[] args) throws IOException {

    File directory = new File();
    //get all the files from a directory
    PrintWriter writer = new PrintWriter("update_repo_maven.bat", "UTF-8");
    writer.println("rem "+ new Date());  
    File[] fList = directory.listFiles();
    for (File file : fList){
        if (file.isFile()){               
        String absolutePath = file.getAbsolutePath() ;
        Manifest  m = new JarFile(absolutePath).getManifest();
        Attributes attributes = m.getMainAttributes();
        String symbolicName = attributes.getValue("Bundle-SymbolicName");

        if(symbolicName!=null &&symbolicName.contains("com.yourCompany.yourProject")) {
            String[] parts =symbolicName.split("\\.");
            String artifactId = parts[parts.length-1];
            String groupId = symbolicName.substring(0,symbolicName.length()-artifactId.length()-1);
            String version = attributes.getValue("Bundle-Version");
            String mavenLine= "call mvn org.Apache.maven.plugins:maven-install-plugin:2.5.1:install-file -Dfile="+ absolutePath+" -DgroupId="+ groupId+" -DartifactId="+ artifactId+" -Dversion="+ version+" -Dpackaging=jar ";
            writer.println(mavenLine);          
        }

        }
    }
    writer.close();
    }

}

任意のIDEからこのmainを実行した後に、update_repo_maven.batを実行してください。

2
Luis Muzikant

ローカルレポジトリを使用することは必ずしも良い考えではないことに注意してください。このプロジェクトを他の人と共有すると、うまくいかないときは他の人全員が問題や質問を抱えることになり、ソース管理システムでもjarファイルが利用できなくなります。

共有リポジトリが最善の解決策ですが、何らかの理由でこれを実行できない場合は、ローカルリポジトリよりjarを埋め込むほうが適しています。ローカルのみのリポジトリのコンテンツは、特に時間の経過とともに、多くの問題を引き起こす可能性があります。

1
Frank

あなたのローカルリポジトリにあなたはコマンドを発行することによってあなたのjarファイルをインストールすることができます

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

MkyoungのWebサイトから同じことをするには、この便利な link に従ってください。また、 mavenガイドも同じように確認できます

1
bpjoshi

何らかの理由で、私が保守しているWebアプリケーションでは、 Alireza Fattahiの解決策 または JJ Romanの解決策 のどちらも正しく動作しませんでした。どちらの場合も、コンパイルは問題ありませんが(jarファイルは表示されます)、パッケージにはjarファイルを戦争に含めることはできません。

私がうまく機能させることができた唯一の方法は、jarを/src/main/webapp/WEB-INF/lib/に置き、それからそれをFattahisまたはRomanのソリューションと組み合わせることでした。

1
Haroldo_OK

私はこの問題に対するもっと良い解決策は maven-install-plugin を使ってインストール時に自動的にファイルをインストールすることだと思います。これが私のプロジェクト用の設定です。

まず、パス(ローカルの.jarsを格納している場所)をプロパティとして追加します。

<properties>
    <local.sdk>/path/to/jar</local.sdk>
</properties>

次に、pluginsの下に、コンパイル時にjarをインストールするためのプラグインを追加します。

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-install-plugin</artifactId>
    <version>2.5.2</version>
    <executions>
        <execution>
            <id>1</id>
            <phase>initialize</phase>
            <goals>
                <goal>install-file</goal>
            </goals>
            <configuration>
                <groupId>com.local.jar</groupId> 
                <artifactId>appengine-api</artifactId>
                <version>1.0</version>
                <packaging>jar</packaging>
                <file>${local.sdk}/lib/impl/appengine-api.jar</file>
            </configuration>
        </execution>
        <execution>
            <id>appengine-api-stubs</id>
            <phase>initialize</phase>
            <goals>
                <goal>install-file</goal>
            </goals>
            <configuration>
                <groupId>com.local.jar</groupId>
                <artifactId>appengine-api-stubs</artifactId>
                <version>1.0</version>
                <packaging>jar</packaging>
                <file>${local.sdk}/lib/impl/appengine-api-stubs.jar</file>
            </configuration>
        </execution>
    </executions>
</plugin>

最後に、依存関係では、jarファイルを追加できます。

<dependency>
    <groupId>com.local.jar</groupId>
    <artifactId>appengine-api</artifactId>
    <version>1.0</version>
</dependency>

<dependency>
    <groupId>com.local.jar</groupId>
    <artifactId>appengine-api-stubs</artifactId>
    <version>1.0</version>
    <scope>test</scope>
</dependency>

このようにプロジェクトを設定すると、プロジェクトを別のコンピュータに持っていってもビルドは続行されます(すべてのjarファイルがlocal.sdkプロパティで指定されたパスにある場合)。

groupIdには、競合がないことを確認するためだけに一意の名前を使用してください。

mvn installまたはmvn testローカルjarが自動的に追加されます。

1
Sudara

サードパーティのjarファイルをインストールするには、以下のようにコマンドを呼び出してください。

mvn install:install-file -DgroupId= -DartifactId= -Dversion= -Dpackaging=jar -Dfile=path

Apache Maven 3.5.4では、二重引用符を追加する必要がありました。二重引用符がないと、それは私にとってうまくいきませんでした。

例:mvn install:install-file "-Dfile = jarファイルの場所" "-DgroupId =グループID" "-DartifactId =アーティファクトID" "-Dversion =バージョン" "-Dpackaging =パッケージタイプ"

0
Kavindu Gayan
  1. mVNインストール

以下のコードをコマンドラインで書くことができます。あるいはEclipseビルトインMavenを使用している場合はプロジェクトを右クリック - >別のユーザーとして実行 - >実行構成...目標とベースディレクトリのコード:$ {project_loc:NameOfYourProject} - >実行

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

それぞれの意味:

<path-to-file>:ロードするファイルへのパス例 - > c:\ kaptcha-2.3.jar

<group-id>:ファイルが登録されるべきグループ(例: - > com.google.code)

<artifact-id>:ファイルのアーティファクト名。例 - > kaptcha

<version>:ファイルのバージョン例 - > 2.3

<包装>:ファイルの包装。 - >ジャー

2.インストール後、pom.xmlでjarを宣言するだけです。

 <dependency>
      <groupId>com.google.code</groupId>
      <artifactId>kaptcha</artifactId>
      <version>2.3</version>
 </dependency>
0
Mazen Embaby

この回答IS Eclipseユーザーのみ

Eclipseを使用している場合は、jarをlib /に置き、jar名を右クリックして「add to build path」をクリックします。 Eclipseは「参照ライブラリ」を作成し、あなたに代わってjarファイルを配置します。

それは私のためのプログラムですぐにjarファイルのインポートを解決しました

0
Anandkumar

私のpom.xmlで一連の依存関係について同じエラーがあり、依存関係のバージョンがpom.xmlで指定されておらず、親リポジトリで言及されていたことがわかりました。何らかの理由でバージョンの詳細がこのリポジトリと同期していませんでした。それゆえ、私は手動でタグを使ってバージョンを入力しました、そして、それは魅力のように働きました。親のバージョンを調べて、ここで指定するのに少し時間がかかりました。しかし、これはアーティファクトエラーを表示しているjarに対してのみ実行でき、それは機能します。これが誰かに役立つことを願っています。

0
Ranjan Rozario