Maven2は実験中/開発の迅速で汚いモックアップ段階で私を夢中にさせています。
使用したいWebアプリケーションフレームワークの依存関係を定義するpom.xml
ファイルがあり、そのファイルからすばやくスタータープロジェクトを生成できます。しかし、pom.xml
ファイルがまだ定義されていないサードパーティーのライブラリにリンクしたい場合があるので、サードパーティーのlib用のpom.xml
ファイルを手動で作成してインストールし、私のpom.xml
に依存関係を追加します。 「私が定義した依存関係に加えて、/lib
にあるjarも含めます」とMavenに伝えたいだけです。
これは単純なはずですが、もしそうであれば、私は何かが足りません。
これを行う方法についてのすべてのポインターは大歓迎です。それにもかかわらず、mavenを/lib
ディレクトリにポイントし、すべての囲まれたjarファイルを単一の依存関係にマップしたpom.xml
を簡単に作成する簡単な方法があれば、それを命名/インストールおよびリンクできます。
インターネット上で見つかる答えのほとんどは、あなたのローカルリポジトリに依存関係をインストールするか、pom
で "system"スコープを指定し、あなたのプロジェクトのソースと一緒に依存関係を配布することをあなたに勧めます。しかし、これらの解決策はどちらも実際には欠陥があります。
ローカルリポジトリに依存関係をインストールしても、そこに残ります。このリポジトリにアクセスできる限り、配布アーティファクトは問題ありません。問題は、ほとんどの場合、このリポジトリはローカルマシンに存在するため、他のマシンへの依存関係を解決する方法はないでしょう。アーティファクトを特定のマシンに依存させることは、物事を処理する方法ではありません。そうでなければ、この依存関係は、そのプロジェクトで動作しているすべてのマシンにローカルにインストールする必要があります。
「システムスコープ」のアプローチであなたが依存するjarファイルは、どのリポジトリにもインストールされることも、あなたのターゲットパッケージに添付されることもありません。だからこそ、あなたのディストリビューションパッケージは使われたときにその依存関係を解決する方法を持っていないでしょう。私が信じているのは、システムスコープの使用が非推奨になった理由でもあります。とにかく、廃止予定の機能に頼りたくないでしょう。
これをpom
に入れた後:
<repository>
<id>repo</id>
<releases>
<enabled>true</enabled>
<checksumPolicy>ignore</checksumPolicy>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<url>file://${project.basedir}/repo</url>
</repository>
グループIDがx.y.z
の各案件について、Mavenは案件の検索にプロジェクトディレクトリ内の次の場所を含めます。
repo/
| - x/
| | - y/
| | | - z/
| | | | - ${artifactId}/
| | | | | - ${version}/
| | | | | | - ${artifactId}-${version}.jar
これについてもっと詳しく述べるには、 このブログ記事 を読むことができます。
手作業でこの構造を作成する代わりに、Mavenプラグインを使用してあなたのjarファイルを成果物としてインストールすることをお勧めします。そのため、repo
フォルダーの下のプロジェクト内リポジトリーに成果物をインストールするには、次のコマンドを実行します。
mvn install:install-file -DlocalRepositoryPath=repo -DcreateChecksum=true -Dpackaging=jar -Dfile=[your-jar] -DgroupId=[...] -DartifactId=[...] -Dversion=[...]
この方法を選択した場合、pom
のリポジトリ宣言を単純化して以下のことが可能になります。
<repository>
<id>repo</id>
<url>file://${project.basedir}/repo</url>
</repository>
Libごとにインストールコマンドを実行するのはちょっと面倒で間違いなく間違いが起こりやすいので、すべてのメタデータ(groupId、artifactId)を自動的に解決しながら、lib
フォルダからプロジェクトリポジトリにすべてのjarを自動的にインストールする ユーティリティスクリプト を作成しました。など)ファイルの名前から。このスクリプトは、あなたのpom
にコピー&ペーストするための依存関係xmlも出力します。
プロジェクト内リポジトリを作成したら、プロジェクトのソースとの依存関係を配布するという問題は解決されていますが、それ以降、プロジェクトのターゲットアーティファクトは公開されていないjarファイルに依存します。リポジトリに保存すると、解決できない依存関係が発生します。
この問題を克服するために、ターゲットパッケージにこれらの依存関係を含めることをお勧めします。これは Assembly Plugin または OneJar Plugin のどちらでも可能です。 OneJarの公式ドキュメンテーションは簡単に把握できます。
コードを捨てる場合のみ
scope == systemを設定し、groupId、artifactId、およびversionを作成するだけです。
<dependency>
<groupId>org.swinglabs</groupId>
<artifactId>swingx</artifactId>
<version>0.9.2</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/swingx-0.9.3.jar</systemPath>
</dependency>
注:システムの依存関係は結果のjar/warにコピーされません
( mavenを使用して構築されたシステム依存関係を戦争に含める方法 を参照)
あなたのプロジェクトにローカルリポジトリを作成することができます
たとえば、プロジェクト構造にlibs
フォルダがあるとします。
libs
フォルダーには、次のようなディレクトリー構造を作成する必要があります。/groupId/artifactId/version/artifactId-version.jar
Pom.xmlにリポジトリを登録する必要があります
<repository>
<id>ProjectRepo</id>
<name>ProjectRepo</name>
<url>file://${project.basedir}/libs</url>
</repository>
そしていつものように依存関係を追加する
<dependency>
<groupId>groupId</groupId>
<artifactId>artifactId</artifactId>
<version>version</version>
</dependency>
それがすべてです。
詳細な情報: Mavenに外部ライブラリを追加する方法
注:システムスコープ( このページで説明されているように )を使用する場合、Mavenには絶対パスが必要です。
Jarファイルがプロジェクトのルートの下にある場合は、systemPath値の先頭に$ {basedir}を付けます。
あなたは本当にリポジトリを通してフレームワークを整備し、あなたの依存関係を前もって識別するべきです。システムスコープを使用することは、「依存関係管理を気にかけない」という理由で、よく使用される間違いです。問題は、これを行うと、通常の状態ではMavenが表示されない、倒錯したMavenビルドになってしまうことです。 this のようなアプローチに従うことをお勧めします。
これは私がやったことです、それはまたパッケージの問題を回避し、それはチェックアウトされたコードで動作します。
repo
を使用した私の場合は、プロジェクト内に新しいフォルダーを作成しましたが、src/repo
を自由に使用してください
私のPOMには、どのパブリックMavenリポジトリにもない依存関係がありました
<dependency>
<groupId>com.dovetail</groupId>
<artifactId>zoslog4j</artifactId>
<version>1.0.1</version>
<scope>runtime</scope>
</dependency>
それから私は次のディレクトリrepo/com/dovetail/zoslog4j/1.0.1
を作成し、JARファイルをそのフォルダにコピーしました。
私は、ダウンロードしたファイルを表すために次のPOMファイルを作成しました(このステップはオプションですが、WARNINGを取り除きます)。
<?xml version="1.0" encoding="UTF-8" ?>
<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dovetail</groupId>
<artifactId>zoslog4j</artifactId>
<packaging>jar</packaging>
<version>1.0.1</version>
<name>z/OS Log4J Appenders</name>
<url>http://dovetail.com/downloads/misc/index.html</url>
<description>Apache Log4j Appender for z/OS Logstreams, files, etc.</description>
</project>
私が作成した2つのオプションのファイルは、POM用のSHA1チェックサムと、チェックサムがないという警告を削除するためのJARです。
shasum -b < repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.jar \
> repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.jar.sha1
shasum -b < repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.pom \
> repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.pom.sha1
最後に、ローカルリポジトリを参照できるようにするために、pom.xmlに次のフラグメントを追加します。
<repositories>
<repository>
<id>project</id>
<url>file:///${basedir}/repo</url>
</repository>
</repositories>
Mavenインストールプラグイン ローカルリポジトリにjarをインストールするためのコマンドライン使用法があります。POMはオプションですが、GroupId、ArtifactId、Version、およびPackaging(すべてのPOMのもの)を指定する必要があります。
これがローカルjarの追加またはインストール方法です
<dependency>
<groupId>org.example</groupId>
<artifactId>iamajar</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/iamajar.jar</systemPath>
</dependency>
必須であるため、デフォルトのgroupIdとartifactIdを指定しました。
私はこれを行うための別の方法を見つけました、 Herokuの投稿からここに見なさい
要約するには(コピー&ペーストについてはごめんなさい)
repo
ディレクトリを作成します。yourproject + - pom.xml + - src ] - - レポ
mvn deploy:deploy-file -Durl = file:/// path/to/yourproject/repo/-Dfile = mylib-1.0.jar -DgroupId = com.example -DartifactId = mylib -Dpackaging = jar - Dversion = 1.0
pom.xml
に追加してください:<repositories> <!--other repositories if any--> <repository> <id>project.local</id> <name>project</name> <url>file:${project.basedir}/repo</url> </repository> </repositories> <dependency> <groupId>com.example</groupId> <artifactId>mylib</artifactId> <version>1.0</version> </dependency>
<scope>system</scope>
を使用することは、他の人が説明する理由のためひどいアイデアです。ローカルリポジトリに手動でファイルをインストールすると、ビルドが再現できなくなります。また、<url>file://${project.basedir}/repo</url>
整形式のfile
URL(たとえば、プロジェクトが異常な文字を含むディレクトリでチェックアウトされている場合)、(2)このプロジェクトのPOMが他の誰かのプロジェクトの依存関係として使用されている場合、結果は使用できません.
アーティファクトをパブリックリポジトリにアップロードしたくない場合、Simeonのヘルパーモジュールの提案がその役割を果たします。しかし、今はもっと簡単な方法があります…
non-maven-jar-maven-plugin を使用します。他のアプローチの欠点はなく、まさにあなたが求めていたものを実行します。
CloudBeesの人たちとこのような種類のJARの適切にパッケージ化されたパッケージングについて非常に長い議論をした後、彼らは解決策のための興味深い良い提案をしました:
既存のJARを主要な成果物としてアタッチする偽のMavenプロジェクトの作成。POMのインストールに属しています。インストールファイルの実行。これはPOMのそのような親族の例です:
<build>
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.3.1</version>
<executions>
<execution>
<id>image-util-id</id>
<phase>install</phase>
<goals>
<goal>install-file</goal>
</goals>
<configuration>
<file>${basedir}/file-you-want-to-include.jar</file>
<groupId>${project.groupId}</groupId>
<artifactId>${project.artifactId}</artifactId>
<version>${project.version}</version>
<packaging>jar</packaging>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
しかしそれを実行するためには、既存のプロジェクト構造を変更する必要があります。まず、そのような種類のJARごとに異なる偽のMavenプロジェクト(モジュール)を作成する必要があることに留意する必要があります。そしてすべてのJARラッパーと既存のメインプロジェクトであるすべてのサブモジュールを含む親Mavenプロジェクトを作成する必要があります。構造は次のようになります。
ルートプロジェクト(これには親POMファイルが含まれ、すべてのサブモジュールが モジュール XML要素)(POMパッケージ)
JAR 1ラッパーMavenの子プロジェクト(POMパッケージ)
JAR 2ラッパーMavenの子プロジェクト(POMパッケージ)
主な既存のMaven子プロジェクト(WAR、JAR、EAR ....パッケージ化)
Mvn:installまたはmvn:packagesで実行されている親が強制され、サブモジュールが実行されます。プロジェクト構造を変更する必要があるため、これはマイナスの点として懸念される可能性がありますが、最後には静的でないソリューションを提供します。
systemPath
の問題は、依存関係のjarファイルがあなたの成果物に沿って推移的な依存関係として分散されないことです。私がここに投稿したものを試してください: プロジェクトのjarファイルをMavenizeするか、それをWEB-INF/libに入れるのが最善ですか?
その後、通常どおり依存関係を宣言します。
そしてフッターノートを読んでください。
あなたが迅速で汚い解決策を望むなら、あなたは以下をすることができます(私はテストプロジェクト以外にはこれをお勧めしませんが、Mavenはこれが適切ではないと長々と不平を言います)。
必要なjarファイルごとに、可能であればPerlスクリプトなどを使って依存関係エントリを追加し、それをコピーしてpomファイルに貼り付けます。
#! /usr/bin/Perl
foreach my $n (@ARGV) {
$n=~s@.*/@@;
print "<dependency>
<groupId>local.dummy</groupId>
<artifactId>$n</artifactId>
<version>0.0.1</version>
<scope>system</scope>
<systemPath>\${project.basedir}/lib/$n</systemPath>
</dependency>
";
A クイック&ダーティー バッチソリューション(Alexの回答に基づく):
libs.bat
@ECHO OFF
FOR %%I IN (*.jar) DO (
echo ^<dependency^>
echo ^<groupId^>local.dummy^</groupId^>
echo ^<artifactId^>%%I^</artifactId^>
echo ^<version^>0.0.1^</version^>
echo ^<scope^>system^</scope^>
echo ^<systemPath^>${project.basedir}/lib/%%I^</systemPath^>
echo ^</dependency^>
)
libs.bat > libs.txt
のように実行してください。次にlibs.txt
を開き、その内容を依存関係としてコピーします。
私の場合、私は自分のコードをコンパイルするためにライブラリだけを必要としていましたが、この解決策がその目的に最適でした。
私にとって最も簡単に思えるのは、あなたのカスタムjarを含むようにあなたのmaven-compiler-pluginを設定することです。この例では、libディレクトリ内のすべてのjarファイルをロードします。
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<includes>
<include>lib/*.jar</include>
</includes>
</configuration>
</plugin>
Mavenリポジトリにないサードパーティのjarファイルをインストールするには、maven-install-pluginを使用してください。
以下が手順です。
mvn install:インストールファイル-Dfile = -DgroupId = -DartifactId = -Dversion = -Dpackaging =
下記は、私がsimonsite log4jに使った例です。
mvn install:インストールファイル-Dファイル=/Users/athanka/git/MyProject /リポジトリ/ log4j-rolling-appender.jar -DgroupId = uk.org.simonsite -DartifactId = log4j-rolling-appender -Dversion = 20150607-2059 Dpackaging = jar
Pom.xmlに以下のような依存関係を含めます
<dependency> <groupId>uk.org.simonsite</groupId> <artifactId>log4j-rolling-appender</artifactId> <version>20150607-2059</version> </dependency>
Mvn clean installコマンドを実行してパッケージを作成してください。
以下は参照リンクです:
https://maven.Apache.org/guides/mini/guide-3rd-party-jars-local.html
私が見つけた奇妙な解決策:
eclipseを使う
歓声、Balint
たとえそれがあなたの問題に正確に合わないとしても、私はこれをここに落とします。私の要求は、
最初に(3)についてお話しましょう:IDEはこれを理解できないので、jarをフォルダに入れてどうにかしてそれらを最後のjarにマージするだけではうまくいきません。これはすべてのライブラリが正しくインストールされなければならないことを意味します。しかし、私はみんなに "mvn install-file"を使ってそれをインストールさせたくありません。
私のプロジェクトではメタウィジェットが必要でした。さあ:
新しいライブラリを作成するたびに、新しい実行を追加して、全員にもう一度プロジェクトを構築するように指示します(プロジェクト階層を使用してこのプロセスを改善できます)。
ここで良い答えを見つけられなかった人たちにとって、これは必要な依存関係をすべて含んだjarファイルを得るために行っていることです。この回答( https://stackoverflow.com/a/7623805/1084306 )はMavenアセンブリプラグインの使用について言及していますが、実際には回答に例を挙げていません。そして、あなたが答えの最後までずっと読んでいなければ(それはかなり長いです)、あなたはそれを見逃すかもしれません。以下をpom.xmlに追加するとtarget/${PROJECT_NAME}-${VERSION}-jar-with-dependencies.jar
が生成されます。
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-Assembly-plugin</artifactId>
<version>2.4.1</version>
<configuration>
<!-- get all project dependencies -->
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<!-- MainClass in mainfest make a executable jar -->
<archive>
<manifest>
<mainClass>my.package.mainclass</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-Assembly</id>
<!-- bind to the packaging phase -->
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
これはあなたのPOMにそれらを追加する方法に答えません、そして、非常に簡単かもしれませんが、あなたのクラスパスの作業にlibディレクトリを追加するだけでしょうか?私は、Mavenリポジトリに追加したくない外部jarが必要なときにそれを実行することを知っています。
お役に立てれば。
私は@alex lehmann'sからの回答へのコメントでいくつかのPythonコードをほのめかしたので、ここに投稿しています。
def AddJars(jarList):
s1 = ''
for elem in jarList:
s1+= """
<dependency>
<groupId>local.dummy</groupId>
<artifactId>%s</artifactId>
<version>0.0.1</version>
<scope>system</scope>
<systemPath>${project.basedir}/manual_jars/%s</systemPath>
</dependency>\n"""%(elem, elem)
return s1
私たちのプロジェクトでうまくいったのはArchimedes Trajanoが書いたものですが、私たちは.m2/settings.xmlの中に次のようなものを書きました。
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://url_to_our_repository</url>
</mirror>
そして*はcentralに変更する必要があります。それで彼の答えがあなたのために働かないなら、あなたはあなたのsettings.xmlをチェックするべきです