jarをインストールせずにmaven 2ビルドクラスパスに追加できますか?


700

Maven2は、実験/開発の迅速で汚れたモックアップフェーズで私を夢中にさせています。

pom.xml使用するWebアプリフレームワークの依存関係を定義するファイルがあり、そのファイルからスタータープロジェクトをすばやく生成できます。ただし、pom.xmlファイルが定義されていないサードパーティライブラリにリンクしたい場合があるので、サードパーティライブラリのpom.xmlファイルを手動で作成してインストールし、依存関係をmyに追加するのでpom.xmlはなく、 Mavenに指示するには:「私の定義した依存関係に加えて、中にあるjarも含め/libます。」

これは単純なはずですが、単純な場合は何かが足りません。

これを行う方法についてのポインタは大歓迎です。それ以外に、mavenを/libディレクトリにポイントpom.xmlし、囲まれたすべてのjarを単一の依存関係にマッピングして簡単に作成する簡単な方法があれば、名前を付けてインストールし、一度にリンクすることもできます。


あなたは、NetBeansを使用している場合は、単に次の手順を実行します。[私はMavenのNetBeansの組み込み使用してMavenのリポジトリにモジュールをインストールするにはどうすればよい?] [1] [1]:stackoverflow.com/a/339874/530153
ラジャット・グプタ

1
このリンクstackoverflow.com/a/339874/530153は、jarを1つずつインストールする場合に機能するように見えることを指摘しておきます。
ポール、

回答:


600

一般的なアプローチの問題

インターネット上で見つかるほとんどの回答は、ローカルリポジトリに依存関係をインストールするか、「システム」スコープをに指定してpom、依存関係をプロジェクトのソースに配布することをお勧めします。しかし、これらのソリューションはどちらも実際には欠陥があります。

「ローカルリポジトリへのインストール」アプローチを適用すべきでない理由

ローカルリポジトリに依存関係をインストールすると、依存関係はそのまま残ります。ディストリビューションアーティファクトは、このリポジトリにアクセスできる限り問題なく動作します。問題は、ほとんどの場合、このリポジトリがローカルマシンにあるため、他のマシンでこの依存関係を解決する方法がないためです。明らかに、アーティファクトを特定のマシンに依存させることは、物事を処理する方法ではありません。それ以外の場合、この依存関係は、そのプロジェクトで動作するすべてのマシンにローカルにインストールする必要がありますが、これはさらに良い方法ではありません。

「システムスコープ」アプローチを適用すべきでない理由

「システムスコープ」アプローチで依存する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検索でプロジェクトディレクトリ内の次の場所が含まれます。

repo/
| - x/
|   | - y/
|   |   | - z/
|   |   |   | - ${artifactId}/
|   |   |   |   | - ${version}/
|   |   |   |   |   | - ${artifactId}-${version}.jar

詳細については、このブログ投稿をご覧ください。

Mavenを使用してプロジェクトリポジトリにインストールする

この構造を手動で作成する代わりに、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に対してインストールコマンドを実行するのはちょっと面倒で間違いも起こりやすいので、すべてのjarをフォルダーからプロジェクトリポジトリに自動的にインストールし、同時にすべてのメタデータ(groupId、artifactIdなど)を自動的に解決するユーティリティスクリプトを作成しましたlibファイルの名前。このスクリプトでは、依存関係のxmlも出力され、にコピーして貼り付けることができますpom

ターゲットパッケージに依存関係を含める

プロジェクト内のリポジトリを作成すると、プロジェクトの依存関係をそのソースと一緒に配布する問題が解決されますが、それ以降、プロジェクトのターゲットアーティファクトは非公開のjarに依存するため、インストールするときにそれをリポジトリに置くと、解決できない依存関係があります。

この問題を解決するには、これらの依存関係をターゲットパッケージに含めることをお勧めします。これは、AssemblyプラグインまたはOneJarプラグインを使用して行うことができます。OneJarに関する公式のドキュメントは簡単に理解できます。


3
私はいつもプロジェクトにリポジトリを作成できると思っていましたが、最終的にそれを確認しました!
albfan 2012

19
2つの注意点:1)WindowsでもRFC準拠のURLを取得するには、「file:// $ {project.basedir} / repo」の代わりに「$ {project.baseUri} repo」を使用することをお勧めします。2)プロジェクトをサブモジュールに構造化する場合、$ {project.baseUri}がモジュールのサブディレクトリに解決されるため、このアプローチは失敗するようです。この問題を解決する方法はありますか?
Oliver Hanappi 2013年

8
これで私はもうすぐそこまで来ました-しかし、Nikitaのスクリプトは、私が持っていたひどい名前のJARファイルをあまりにも巧妙にしようとしました。そのため、groupIdを
Tom Carchrae

3
こんな素晴らしい答え!! 何かを行うには、正しい方法と機能する方法の2つの方法があります。
Panthro 2013年

1
ここでは、jarファイルからアーティファクトを自動的に生成する方法についても説明しています。devcenter.heroku.com
Dirk

485

使い捨てコードのみ

スコープ==システムを設定し、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を使用して構築されたwarにシステム依存関係を含める方法を参照)


4
ありがとう、これは本当に私が欲しいものに近いです。それらをすべて単一のエントリとして追加する方法はありますか?たとえば、10個のjarを含む/ libがあるとします。たとえば、systemPathに/some/path/*.jarを使用してそれらをすべて追加できますか?それとも、それぞれを既知の依存関係として扱う必要がありますか?それでも、本当に必要なものに非常に近いです、ありがとう!

11
次のようなsystemPathを使用します。「<systemPath> $ {basedir} /lib/BrowserLauncher2-1_3.jar </ systemPath>」$ {basedir}はプロジェクトのルートを指します。
フレデリックモーリン、

4
プロジェクトを使用することをお勧めします。次のようにパスのプレフィックス:<systemPath> $ {project.basedir} /lib/AwesomeLib.jar </ systemPath>
Matthew McCullough

76
これがOPが求めていたものであることは理解していsystemますが、スコープの使用はひどい習慣であり、お勧めできませんDependency + Scopesを参照してください。
Pascal Thivent

6
@mariooshは、質問の元々の意図が迅速な実験のためであることを思い出してください。mvnパッケージを作成する場合は、jarをリポジトリにインストールします。
Pyrolistical 2011年

63

プロジェクトにローカルリポジトリを作成できます

たとえば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で外部ライブラリを追加する方法


1
あなたの答えはほぼ正しいです。groupIdは、サーバーサブディレクトリに分割する必要があります。
Peter Fortuin、2014

5
もちろん、「com.foo.bar」のような複雑なgroupIdがある場合、ディレクトリ構造は/com/foo/bar/artifactId/version/artifactId-verion.jar
Dmytro Boichenko

これは1年前の回答とは大きく異なりますか?
Joshua Taylor、

jarファイルが配置されている最後のディレクトリに、関連するpom xmlファイルも追加する必要があります。
フェデリコ


15

これは私がやったことであり、パッケージの問題を回避し、チェックアウトされたコードで動作します。

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ファイルを作成し(この手順はオプションですが、警告は削除されます)、次の人がファイルをどこから取得したかを理解するのに役立ちます。

<?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>

こんにちは、pomファイルをローカルリポジトリまたはjarファイルの横に配置しましたか?
Peymankh

上記のソリューションでは、JARファイルの隣にありました。作業量が多すぎるため、上記の解決策は好きではありません。
アルキメデストラハノ

私はまだ、私はここに掲載ソリューションを好むstackoverflow.com/questions/2229757/...
アルキメデストラハノ

私はこのアプローチが好きですが、ローカルリポジトリへのjarのインストールを自動化するためにmavenインストールプラグインを使用しました。
カールG

13

リポジトリを介してフレームワークを準備し、依存関係を事前に特定する必要があります。システムスコープの使用は、「依存関係の管理について気にしない」ため、よくある間違いです。問題は、これを行うと、通常の状態ではMavenを表示しない変態的なMavenビルドになることです。あなたはこのようなアプローチに従うほうがよいでしょう。


12

これは、ローカル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を指定しました:)


11

Mavenインストールプラグインは、jarをローカルリポジトリにインストールするコマンドラインを使用します。POMはオプションですが、GroupId、ArtifactId、Version、およびPackaging(すべてのPOMのもの)を指定する必要があります。


実際、彼が言っているのは、ローカルリポジトリにインポートするライブラリのpomを作成する必要がないということです
Frederic Morin

5
-1、時々あなたはそれをインストールする手間をかけずにjarファイルを追加したいだけです。
レオネル

8

<scope>system</scope>他の人が説明した理由で使用するのはひどい考えです。ローカルリポジトリにファイルを手動でインストールするとビルドが再現<url>file://${project.basedir}/repo</url>できなくなります。また、(1)整形式のfileURL ではない可能性があるため(プロジェクトの場合など)、使用することもお勧めできません。が異常な文字を含むディレクトリでチェックアウトされた場合)、(2)このプロジェクトのPOMが他の誰かのプロジェクトの依存関係として使用されている場合、結果は使用できません。

アーティファクトをパブリックリポジトリにアップロードしたくない場合は、Simeonのヘルパーモジュールの提案が役立ちます。しかし、今より簡単な方法があります...

勧告

non-maven-jar-maven-pluginを使用してください。他のアプローチの欠点がなく、あなたが求めていたものを正確に実行します。


また、maven-external-dependency-pluginも見ましたが、非maven-jar-maven-pluginの方が簡単に使用できます。
Jesse Glick 2013

8

これを行う別の方法を見つけました。Herokuの投稿からここを参照してください

要約するには(いくつかのコピー&ペーストについて申し訳ありません)

  • repoルートフォルダの下にディレクトリを作成します。
あなたのプロジェクト
+-pom.xml
+-src
+-リポジトリ
  • これを実行して、jarをローカルリポジトリディレクトリにインストールします。
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>

6

そのような種類のJARの適切なmavenパッケージについてCloudBeesの担当者と長い間話し合った後、彼らはソリューションについて興味深い優れた提案をしました。

付属のPOM install:install-file実行で実行される、既存のJARをプライマリアーティファクトとしてアタッチする偽のMavenプロジェクトの作成。POMのそのようなkinfの例を次に示します。

 <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:packagingを介して実行されている場合は強制され、サブモジュールが実行されます。プロジェクト構造を変更する必要があるため、ここではマイナスとして懸念されるかもしれませんが、最後に非静的ソリューションを提供します


単なる観察ですが、追加するJARごとに新しいPOMを作成する必要はないと思います。追加する jarの実行ブロックがある場合は、単一のPOMを作成してすべてのJARを追加するだけで十分です。各ブロックに一意のIDがあることを確認する必要があるだけです。結果は、すべてのJARをローカルリポジトリに追加する単一のMavenモジュールです。(Mavenの座標がすでにそこにあるか、後で追加される可能性のあるものと衝突しないことを確認してください!)
Stormcloud

ヒーロー。これはまさに私が欲しかったものです。いい奴だ。2013年は良い年だったに違いありません;)
ndtreviv

5

私にとって最も簡単に思えるのは、カスタム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>

1
私はこのMavenを追加した場合says nothing to complile
Ravi Parekh

それall classes are up to date nothing to compile*.javaもう探さないからと言っています。を使用して再度追加できます<include>**/*.java</include>。しかし、瓶の成功はありません
Michael Laffargue

@Imiguelmh、これがjarで機能しない理由はありますか?
kisna


3

私が見つけた奇妙な解決策:

Eclipseの使用

  • 単純な(非maven)Javaプロジェクトを作成する
  • メインクラスを追加する
  • すべてのjarをクラスパスに追加します
  • Runnable JARをエクスポートします(他に方法がないため重要です)
  • 必要なライブラリを生成されたJARに抽出するを選択します
  • ライセンスの問題を決定する
  • tadammm ...生成されたjarをm2repoにインストールします
  • この単一の依存関係を他のプロジェクトに追加します。

乾杯、バリント


3

迅速でダーティーなソリューションが必要な場合は、次のことを行うことができます(テストプロジェクト以外にはこれをお勧めしませんが、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>
";

はい、これはまさに私が探していたものです。研究テストコードのためにそれをプッシュする方法。派手なものは何もありません。ええ、私はそれが彼らのすべてが言うことだと知っています:)さまざまなMavenプラグインソリューションは私の目的にとってやり過ぎであるようです。いくつかのjarファイルがあり、それらはpomファイルを含むサードパーティライブラリとして提供されています。すばやくコンパイル/実行したい。私がpythonにさりげなく適応させたこのソリューションは、私にとって不思議に働きました。私のポンポンに切り貼りしました。
ポール

3

迅速&汚い(アレックスの回答に基づいて)バッチソリューション:

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、そのコンテンツを開き、依存関係としてコピーします。

私の場合、コードをコンパイルするのに必要なのはライブラリだけであり、このソリューションはその目的に最適でした。


2

それはあなたの問題に完全には適合していませんが、ここでこれをドロップします。私の要件は:

  1. オンラインのMavenリポジトリーにないJARはSVNにあるはずです。
  2. ある開発者が別のライブラリを追加する場合、他の開発者が手動でそれらをインストールすることに煩わされるべきではありません。
  3. IDE(私の場合はNetBeans)は、オートコンプリートとヘルプを提供するソースとjavadocsを見つけることができるはずです。

最初に(3)について話しましょう:jarをフォルダーに入れ、それらを最終的なjarにマージするだけでは、IDEはこれを理解できないため、ここでは機能しません。つまり、すべてのライブラリを適切にインストールする必要があります。ただし、「mvn install-file」を使用して全員にインストールさせたくありません。

私のプロジェクトでは、メタウィジェットが必要でした。さあ行こう:

  1. 新しいmavenプロジェクトを作成します(「shared-libs」などの名前を付けます)。
  2. メタウィジェットをダウンロードし、zipをsrc / main / libに抽出します。
  3. フォルダーdoc / apiにはjavadocsが含まれています。コンテンツのzipを作成します(doc / api / api.zip)。
  4. このようにポンを変更します
  5. プロジェクトをビルドすると、ライブラリがインストールされます。
  6. ライブラリを依存関係としてプロジェクトに追加するか、または(共有ライブラリプロジェクトに依存関係を追加した場合)共有ライブラリを依存関係として追加して、すべてのライブラリを一度に取得します。

新しいライブラリを作成するたびに、新しい実行を追加し、プロジェクトを再度ビルドするよう全員に指示します(プロジェクト階層を使用してこのプロセスを改善できます)。


あなたはMavenをチェックしたいかもしれません:相対パスでjarに依存関係を追加します(これはより良い代替案です)。
Pascal Thivent、2010

ローカルリポジトリのプロジェクトへの相対パスが常に同じであることを確認できれば、さらに良いです。別の場所に多くのプロジェクト(または異なるブランチ)がある場合、これは機能しません。
頭足類2010

私の答えは、プロジェクト内のjarについてpom.xmlに伝える方法があります。なぜそれをしないで、それを$ {basedir} / libのjarにポイントするのですか
Ed Brannin

1
@Edそれはシステムスコープの目的ではないため、システムスコープの依存関係には多くの副作用があります。これは完全に禁止されるべき恐ろしい慣行です。
Pascal Thivent、2009

2

mavenリポジトリにないサードパーティのjarをインストールするには、maven-install-pluginを使用します。

以下が手順です。

  1. ソース(Webサイト)から手動でjarファイルをダウンロードします。
  2. フォルダーを作成し、jarファイルをその中に配置します
  3. 以下のコマンドを実行して、サードパーティのjarをローカルのmavenリポジトリにインストールします

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

以下は私がsimonsite log4jに使用した例です

mvn install:install-file -Dfile = / Users / athanka / git / MyProject / repo / log4j-rolling-appender.jar -DgroupId = uk.org.simonsite -DartifactId = log4j-rolling-appender -Dversion = 20150607-2059- dpackaging = jar

  1. pom.xmlに以下のように依存関係を含めます

      <dependency> 
            <groupId>uk.org.simonsite</groupId>
            <artifactId>log4j-rolling-appender</artifactId>
            <version>20150607-2059</version> 
      </dependency>
  2. mvn clean installコマンドを実行してパッケージを作成します

以下は参照リンクです:

https://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html


これは境界線のリンクのみの回答です。ここにできるだけ多くの情報を含めるように回答を拡張し、参照用にのみリンクを使用する必要があります。
さようならStackExchange 2016年

2

ここで良い答えが見つからなかった人のために、必要な依存関係がすべて含まれているjarを取得するためにこれを行っています。この回答(https://stackoverflow.com/a/7623805/1084306)は、Maven Assemblyプラグインの使用について言及していますが、実際には回答の例を示していません。そして、答えの最後まで読んでいないと(かなり長いので)、見落とす可能性があります。以下を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>

1

@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

0

これは、それらをPOMに追加する方法には答えません。簡単なことかもしれませんが、lib dirをクラスパスに追加するだけで動作しますか?私は、Mavenリポジトリに追加したくない外部jarが必要なときにそれを行うことを知っています。

お役に立てれば。


1
これは私がやっていたことであり、機能しますが、グローバルクラスパスを汚染するので、それを回避しようとしています。ありがとう!

@purple正確にどうやってやったの?
TheRealChx101

0

私たちのプロジェクトで機能するのはArchimedes Trajanoが書いたものですが、.m2 / settings.xmlには次のようなものが含まれています。

 <mirror>
  <id>nexus</id>
  <mirrorOf>*</mirrorOf>
  <url>http://url_to_our_repository</url>
 </mirror>

*は中央に変更する必要があります。したがって、彼の答えがうまくいかない場合は、settings.xmlを確認してください。


0

私はただ素早くて汚い回避策が欲しかったのです... Nikita Volkovからスクリプトを実行できませんでした:構文エラー+ jar名には厳密な形式が必要です。

私はこのPerlスクリプトを作成して、jarファイル名のどのような形式でも機能し、依存関係をxmlで生成するため、pomに直接コピーして貼り付けることができます。

あなたがそれを使用する場合は、スクリプトが何をしているかを理解しておいてください、あなたは変更する必要がありますlibフォルダとの値groupIdかをartifactId...

#!/usr/bin/perl

use strict;
use warnings;

open(my $fh, '>', 'dependencies.xml') or die "Could not open file 'dependencies.xml' $!";
foreach my $file (glob("lib/*.jar")) {
    print "$file\n";
    my $groupId = "my.mess";
    my $artifactId = "";
    my $version = "0.1-SNAPSHOT";
    if ($file =~ /\/([^\/]*?)(-([0-9v\._]*))?\.jar$/) {
        $artifactId = $1;
        if (defined($3)) {
            $version = $3;
        }
        `mvn install:install-file -Dfile=$file -DgroupId=$groupId -DartifactId=$artifactId -Dversion=$version -Dpackaging=jar`;
        print $fh "<dependency>\n\t<groupId>$groupId</groupId>\n\t<artifactId>$artifactId</artifactId>\n\t<version>$version</version>\n</dependency>\n";
        print " => $groupId:$artifactId:$version\n";
    } else {
        print "##### BEUH...\n";
    }
}
close $fh;

0

Javaのscope = 'system'アプローチのソリューション:

public static void main(String[] args) {
        String filepath = "/Users/Downloads/lib/";
        try (Stream<Path> walk = Files.walk(Paths.get(filepath))) {

        List<String> result = walk.filter(Files::isRegularFile)
                .map(x -> x.toString()).collect(Collectors.toList());

                String indentation = "    ";
                for (String s : result) {
                    System.out.println(indentation + indentation + "<dependency>");
                    System.out.println(indentation + indentation + indentation + "<groupId>"
                            + s.replace(filepath, "").replace(".jar", "")
                            + "</groupId>");
                    System.out.println(indentation + indentation + indentation + "<artifactId>"
                            + s.replace(filepath, "").replace(".jar", "")
                            + "</artifactId>");
                    System.out.println(indentation + indentation + indentation + "<version>"
                            + s.replace(filepath, "").replace(".jar", "")
                            + "</version>");
                    System.out.println(indentation + indentation + indentation + "<scope>system</scope>");
                    System.out.println(indentation + indentation + indentation + "<systemPath>" + s + "</systemPath>");
                    System.out.println(indentation + indentation + "</dependency>");
                }

    } catch (IOException e) {
        e.printStackTrace();
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.