プロジェクトのライブラリソースにローカルjarファイル(まだMavenリポジトリの一部ではない)を直接追加するにはどうすればよいですか?
install-file
プロジェクトのライブラリソースにローカルjarファイル(まだMavenリポジトリの一部ではない)を直接追加するにはどうすればよいですか?
install-file
回答:
次のように、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
<version>
:ファイルのバージョン例→ 2.3
<packaging>
:ファイルのパッケージ化例→ jar
参照
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/Name_Your_JAR.jar</systemPath>
</dependency>
更新
新しいリリースでは、この機能は非推奨とマークされていますが、まだ機能しており、まだ削除されていません(Mavenの起動時にログに警告が表示されるだけです)。このhttps://issues.apache.org/jira/browse/MNG-6523についてmavenグループで問題が発生しています(参加して、この機能が役立つ場合がある理由を説明できます)。この機能が残っていることを願っています!
機能が削除されない限り、私に質問があれば、これを使用して、リポジトリーに適合しないプロジェクト内の1つのいたずらなjarファイルのみに依存します。この機能が削除された場合、まあ、私は後でここから選ぶことができる良い答えがたくさんあります!
artifactId
し、groupId
周りの間違った方法?
まず、この答えを匿名のスタックオーバーフローユーザーに紹介したいと思います。以前に同じような答えを見たことがあると思いますが、今は見つかりません。
ローカルJARファイルを依存関係として持つ最良のオプションは、ローカルMavenリポジトリーを作成することです。このようなリポジトリは、pomファイルを含む適切なディレクトリ構造にすぎません。
私の例では、${master_project}
ロケーションにマスタープロジェクトがあり、subproject1がオンになってい${master_project}/${subproject1}
ます。
次に、Mavenリポジトリを次の場所に作成します
${master_project}/local-maven-repo
。
にあるsubproject1のpomファイルで${master_project}/${subproject1}/pom.xml
、ファイルパスをURLパラメータとして取るリポジトリを指定する必要があります。
<repositories>
<repository>
<id>local-maven-repo</id>
<url>file:///${project.parent.basedir}/local-maven-repo</url>
</repository>
</repositories>
他のリポジトリと同様に依存関係を指定できます。これにより、pomリポジトリが独立します。たとえば、目的のJARがMavenセントラルで利用可能になったら、ローカルリポジトリから削除するだけで、デフォルトのリポジトリからプルされます。
<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リポジトリよりも迅速でダーティーなソリューションの方が優れている場合があります。
${project.parent.basedir}
今日は何にも解決しないようですので、私${project.basedir}/..
は完璧に使用しました。
<mirrorOf>*</mirrorOf>
。
新しいフォルダーを作成します。たとえばlocal-maven-repo
、Mavenプロジェクトのルートに作成します。
ちょうどあなたの内部のローカルリポジトリを追加<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]
local-maven-repo
、あなたのソースフォルダに(この例では、子供のように)含まれている
私はそのような解決策maven-install-plugin
が欲しい-pomファイルで使用:
<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ステップで使用できます(この依存関係を他のmaven依存関係として<dependency></dependency>
タグ付きpomに含めることを忘れないでください)。jarのインストールをinitialize
ステップではなく、他の任意のステップにバインドすることもできます。
mvn initialize
以前に実行した場合にのみmvn package
:mvn initialize package
中央リポジトリからJARをダウンロードできない、またはダウンロードしようとします。どうしてこれなの?この目標/フェーズを順番に実行すると思いました。
compile
れる場合、ビルドは失敗します。
<dependency>
<groupId>group id name</groupId>
<artifactId>artifact name</artifactId>
<version>version number</version>
<scope>system</scope>
<systemPath>jar location</systemPath>
</dependency>
<scope>system
は非推奨になりました。
install:install-file
ように、ローカルリポジトリへのアーティファクトを "通常の"依存関係(デフォルトのスコープcompile
)として使用するか、プロジェクト内リポジトリソリューションを使用します。
本当に速くて汚い方法はローカルファイルを指すことです:
<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)を使用するか、これらのアーカイブがないか、ローカルのmavenをセットアップしたくない場合構造化されたアーカイブとpomの「リポジトリ」を構成:ローカル:
<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>
<url>file:${basedir}</url>
代わりにベースURLとして使用する必要があります。
独自のローカルJARをPOMファイルに追加し、それを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に追加します。
1つの方法は、独自のMavenリポジトリマネージャー(Nexusなど)にアップロードすることです。とにかく、独自のリポジトリマネージャを用意することをお勧めします。
私が最近見たもう1つの良い方法は、ビルドライフサイクルにMavenインストールプラグインを含めることです。ローカルリポジトリにファイルをインストールするようにPOMで宣言します。それは少しですが小さなオーバーヘッドであり、手動の手順は含まれていません。
http://maven.apache.org/plugins/maven-install-plugin/install-file-mojo.html
もちろん、そのフォルダーにjarを追加できます。しかし、おそらくそれはあなたが達成したいことではありません...
コンパイルにこれらのjarが必要な場合は、この関連質問を確認してください。jarをインストールせずにmaven 2ビルドクラスパスに追加できますか?
また、誰かが提案する前に、システムスコープを使用しないでください。
別の興味深いケースは、プロジェクトにプライベートMaven jarを含めたい場合です。推移的な依存関係を解決するために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 /リポジトリと次のフォルダが表示されます
com / mycompany / myproject / 1.2.3
libsフォルダー内のすべてをコピーします(これも.m2 / repositoryの下のフォルダーを含みます)。これで完了です。
この問題のより良い解決策は、maven-install-pluginを使用して、インストール時にファイルを自動的にインストールすることです。これが私のプロジェクト用に設定した方法です。
最初に、パス(ローカル.jarを格納する場所)をプロパティとして追加します。
<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でいっぱいのフォルダーをアップロードできるコードを共有したいと思います。これは、プロバイダーに公開リポジトリーがなく、多数のライブラリーを手動で追加する必要がある場合に役立ちます。メモリ不足エラーの可能性があるため、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から実行した後、update_repo_maven.batを実行します。
String symbolicName = attributes.getValue("Bundle-SymbolicName"); if(symbolicName!=null &&symbolicName.contains("com.yourCompany.yourProject"))
は、カスタム jar のみがサポートされることを示しているようです。それは私たちが必要とするものではありません:代わりにたくさんのサードパーティのjarファイル。あなたはどのようにインストールする提案があります任意の jarファイルをこのように?
これは新しいバージョンの短い構文です:
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
また、見てください...
<scope>compile</scope>
Mavenの依存関係。これはデフォルトですが、場合によっては、スコープを明示的に設定して、ローカルリポジトリでローカルライブラリを検索するようにMavenも設定しています。
何らかの理由で、私がメンテナンスを行っているWebアプリケーションでは、Alireza FattahiのソリューションもJJ Romanのソリューションも正しく機能しませんでした。どちらの場合も、コンパイルは正常に行われます(jarが表示されます)が、パッケージには戦争内のjarが含まれていません。
私がそれをうまく機能させる唯一の方法は、瓶を置いて、/src/main/webapp/WEB-INF/lib/
それをFattahisのソリューションまたはRomanのソリューションのいずれかと組み合わせることでした。
ローカルリポジトリを使用することは必ずしも良い考えではないことに注意してください。このプロジェクトが他の人と共有されている場合、それが機能しない場合は他のすべての人に問題と質問があり、ソース管理システムでもjarを使用できません。
共有リポジトリが最善の答えですが、何らかの理由でこれを実行できない場合は、jarを埋め込む方がローカルリポジトリよりも優れています。ローカルのみのリポジトリのコンテンツは、特に時間の経過とともに、多くの問題を引き起こす可能性があります。
サードパーティのjarをインストールするには、次のようなコマンドを呼び出してください
mvn install:install-file -DgroupId= -DartifactId= -Dversion= -Dpackaging=jar -Dfile=path
- mvn install
コマンドラインで以下のコードを書くか、Eclipse組み込みのMavenを使用している場合は、プロジェクトを右クリックして->実行->構成を実行...->左パネルで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)
<アーティファクトID>:ファイルのアーティファクト名例-> kaptcha
<バージョン>:ファイルのバージョン例-> 2.3
<パッケージング>:ファイルのパッケージ化例--jar
2.インストール後、pom.xmlでjarを宣言するだけです。
<dependency>
<groupId>com.google.code</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3</version>
</dependency>
ステップ1:でmaven-install-plugin
目標を設定install-file
しますpom.xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<executions>
<execution>
<id>install-external-non-maven-jar-MWS-Client-into-local-maven-repo</id>
<phase>clean</phase>
<configuration>
<repositoryLayout>default</repositoryLayout>
<groupId>com.amazonservices.mws</groupId>
<artifactId>mws-client</artifactId>
<version>1.0</version>
<file>${project.basedir}/lib/MWSClientJavaRuntime-1.0.jar</file>
<packaging>jar</packaging>
<generatePom>true</generatePom>
</configuration>
<goals>
<goal>install-file</goal>
</goals>
</execution>
</executions>
</plugin>
file
実際のファイルパスに基づいてパスを編集するようにしてください(これらの外部の非Maven jarをいくつかのフォルダー内に配置することをお勧めします。たとえばlib
、このlib
フォルダーをプロジェクト内に配置して、プロジェクト固有の相対パスを使用し、システムの追加を避けます。特定の絶対パス。
複数の外部jarがある場合は<execution>
、同じ内の他のjarに対してを繰り返しますmaven-install-plugin
。
ステップ2:ファイルにmaven-install-plugin
上記のようにを設定pom.xml
したらpom.xml
、通常どおりにこれらのjarを使用する必要があります。
<dependency>
<groupId>com.amazonservices.mws</groupId>
<artifactId>mws-client</artifactId>
<version>1.0</version>
</dependency>
はmaven-install-plugin
、外部jarをローカルの.m2
mavenリポジトリにコピーするだけであることに注意してください。それでおしまい。これらのjarがプロジェクトへのmaven依存関係として自動的に含まれることはありません。
ささいなことですが、見逃してしまうこともあります。
yourproject
+- pom.xml
+- src
yourproject
+- pom.xml
+- src
+- repo
mvn deploy:deploy-file -Durl=file:///pathtoyour/repo -Dfile=your.jar -DgroupId=your.group.id -DartifactId=yourid -Dpackaging=jar -Dversion=1.0
mvn install:install-file -Dfile=/path-to-your-jar-1.0.jar -DpomFile=/path-to-your-pom-1.0.pom
<repositories>
<!--other repositories if any-->
<repository>
<id>project.local</id>
<name>project</name>
<url>file:${project.basedir}/repo</url>
</repository>
</repositories>
<dependency>
<groupId>com.groupid</groupId>
<artifactId>myid</artifactId>
<version>1.0</version>
</dependency>
この回答は、ECLIPSEユーザーのみを対象としています。
Eclipseを使用している場合は、jarをlib /に配置し、jar名を右クリックして[ビルドパスに追加]をクリックします。Eclipseは「参照ライブラリ」を作成し、jarを配置します
それは私のためにプログラムですぐに瓶のインポートを解決しました
.classpath
が、あなたのMavenビルドはmvn package
Mavenのは、それが定義されていませんし、それだけにする必要がありますように、あなたはその依存関係を使用して開始するとbrocketになりますpom.xml