ローカルのjarファイル(まだMavenリポジトリの一部ではない)をプロジェクトのライブラリソースに直接追加する方法を教えてください。
次のように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>
:ファイルの案件名。例:kaptcha
name__
<version>
:ファイルのバージョン例→→2.3
<packaging>
:ファイルのパッケージ化→jar
name__
参照
install:install-file
の目標次のようにローカル依存関係を直接追加することができます( 独自ライブラリを含む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ファイルのみに依存させる リポジトリに収まらない私のプロジェクトで使用します。この機能が削除された場合、まあ、私が後で選ぶことができるたくさんの良い答えがここにあります!
最初に、私は匿名の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リポジトリよりも優れている場合があります。
新しいフォルダを作成し、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]
<dependency>
<groupId>group id name</groupId>
<artifactId>artifact name</artifactId>
<version>version number</version>
<scope>system</scope>
<systemPath>jar location</systemPath>
</dependency>
私はそのような解決策が欲しい - 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
ステップではなく、他の好きなステップにバインドすることもできます。
はい、できますがそれはお勧めできません。
代わりにこれらすべてのjarファイルをmaven reposにインストールしてください
以下も参照してください
1つの方法はそれをあなた自身のMavenリポジトリマネージャ(Nexusなど)にアップロードすることです。とにかく独自のリポジトリマネージャを持つことは良い習慣です。
私が最近見たもう1つのいい方法は、ビルドライフサイクルにMavenインストールプラグインを含めることです。ローカルリポジトリにファイルをインストールするようにPOMで宣言します。それは少し小さいがわずかなオーバーヘッドであり、手動のステップは含まれません。
http://maven.Apache.org/plugins/maven-install-plugin/install-file-mojo.html
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に追加します。
本当に速くて汚い方法は、ローカルファイルを指すことです。
<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>
もちろん、そのフォルダにjarを追加することもできます。しかし、多分それはあなたが達成したいものではありません...
コンパイルにこれらのjarファイルが必要な場合は、次の関連質問をチェックしてください。 インストールしなくてもmaven 2 build classpathにjarファイルを追加できますか?
また、誰かがそれを提案する前に、システムスコープを使用しないでください。
コマンドライン :
mvn install:install-file -Dfile=c:\kaptcha-{version}.jar -DgroupId=com.google.code
-DartifactId=kaptcha -Dversion={version} -Dpackaging=jar
もう1つの興味深いケースは、あなたが自分のプロジェクトにプライベートメイバージャーを入れたいときです。推移的な依存関係を解決するためにMavenの機能を維持することをお勧めします。解決策はかなり簡単です。
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>
.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 の下のフォルダも含む)、これで完了です。
望ましい方法はあなた自身のリモートリポジトリを作成することでしょう。
やり方の詳細については ここ を見てください。 「 リモートリポジトリへのアップロード 」のセクションを見てください。
また見てください...
<scope>compile</scope>
Mavenの依存関係 。これがデフォルトですが、場合によってはその範囲を明示的に設定してMavenもローカルリポジトリ内のローカルライブラリを検索することを発見しました。
これは新しいバージョンのための短い構文です:
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
私はあなたが瓶でいっぱいのフォルダーをアップロードすることができるコードを共有したいです。プロバイダが公開リポジトリを持っておらず、たくさんのライブラリを手動で追加する必要があるときに便利です。 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を実行してください。
ローカルレポジトリを使用することは必ずしも良い考えではないことに注意してください。このプロジェクトを他の人と共有すると、うまくいかないときは他の人全員が問題や質問を抱えることになり、ソース管理システムでもjarファイルが利用できなくなります。
共有リポジトリが最善の解決策ですが、何らかの理由でこれを実行できない場合は、ローカルリポジトリよりjarを埋め込むほうが適しています。ローカルのみのリポジトリのコンテンツは、特に時間の経過とともに、多くの問題を引き起こす可能性があります。
あなたのローカルリポジトリにあなたはコマンドを発行することによってあなたのjarファイルをインストールすることができます
mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> \
-DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>
MkyoungのWebサイトから同じことをするには、この便利な link に従ってください。また、 mavenガイドも同じように確認できます
何らかの理由で、私が保守しているWebアプリケーションでは、 Alireza Fattahiの解決策 または JJ Romanの解決策 のどちらも正しく動作しませんでした。どちらの場合も、コンパイルは問題ありませんが(jarファイルは表示されます)、パッケージにはjarファイルを戦争に含めることはできません。
私がうまく機能させることができた唯一の方法は、jarを/src/main/webapp/WEB-INF/lib/
に置き、それからそれをFattahisまたはRomanのソリューションと組み合わせることでした。
私はこの問題に対するもっと良い解決策は 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が自動的に追加されます。
サードパーティの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 =パッケージタイプ"
- 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>
この回答IS Eclipseユーザーのみ
Eclipseを使用している場合は、jarをlib /に置き、jar名を右クリックして「add to build path」をクリックします。 Eclipseは「参照ライブラリ」を作成し、あなたに代わってjarファイルを配置します。
それは私のためのプログラムですぐにjarファイルのインポートを解決しました
私のpom.xmlで一連の依存関係について同じエラーがあり、依存関係のバージョンがpom.xmlで指定されておらず、親リポジトリで言及されていたことがわかりました。何らかの理由でバージョンの詳細がこのリポジトリと同期していませんでした。それゆえ、私は手動でタグを使ってバージョンを入力しました、そして、それは魅力のように働きました。親のバージョンを調べて、ここで指定するのに少し時間がかかりました。しかし、これはアーティファクトエラーを表示しているjarに対してのみ実行でき、それは機能します。これが誰かに役立つことを願っています。