2

質問のタイトルでわかりにくい場合は、ここで詳しく説明します。あるMavenアプリケーションの本番jarを他のMavenWebアプリケーションで使用する必要があるとします。そのjarを2番目のアプリケーションのMaven依存関係に追加しても、推移的な依存関係は追加されません。また、jar自体はアプリケーションです。

1つの方法は、最初のアプリケーションのPOMを確認し、それらを他のアプリケーションのPOMに追加することです。しかし、中央のMaven jarは、プロジェクトに追加されたときに、どのようにして独自の推移的な依存関係を追加するのでしょうか。

つまり、commons-io.jarプロジェクトにMaven依存関係を追加すると、推移的な依存関係が自動的に追加されます。しかしmyjar.jar、Maven依存関係(スコープ->システム)として追加すると、推移的な依存関係が自動的に追加されません。

そのような場合に使用できる他の原型として、最初のアプリケーションを開発する必要があると思います。先に進む方法を教えてください。

この初心者の質問でごめんなさい。実際、私はMavenを初めて使用し、Netbeans-embedded-mavenを使用してアプリケーションを作成し始めました。Mavenが仕事を単純化する方法が本当に好きです。

edited

もっと詳しく説明したほうがいいようです。これがこれです。

A.jar、B.jar、C.jarを使用するプログラム/アプリケーションを作成し、本番出力がX.jar(Mavenのデフォルトビルドに従って他のjarが含まれていないことは明らかです)であるとします。上記のA、B、C jarは、Maven中央リポジトリに存在し、プロジェクトへの依存関係として追加されました。プロジェクトビルドjarはX.jarです

ここで、システム依存関係としてX.jarを追加した別のアプリケーションを作成します。必要なのは、A.jar、B.jar、C.jarがX.jarの推移的な依存関係であるため、プロジェクトに自動的に追加されることです。

今回はそれを明確に説明したことを願っています。以前に理解できなかった場合に備えて、私の文体をお許しください。

1つの解決策は、次のようなものを使用して、その中にすべての依存関係を含むX.jarを構築することです。

 <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <mainClass>com.nitinsurana.mlmmaven.Start</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-my-jar-with-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

しかし、私はシステム依存関係の推移的な依存関係を自動的に追加するものを探しています。

4

4 に答える 4

2

systemスコープは、別のアプリケーションでパッケージ化される実際のjar依存関係に使用されることは想定されていません。公式ドキュメントからの引用:

スコープシステムとの依存関係は常に利用可能であり、リポジトリで検索されません。これらは通常、JDKまたはVMによって提供される依存関係についてMavenに通知するために使用されます。したがって、システムの依存関係は、現在JDKによって提供されているアーティファクトへの依存関係を解決するのに特に役立ちますが、以前は個別のダウンロードとして利用可能でした。典型的な例は、JDBC標準拡張機能またはJava認証および承認サービス(JAAS)です。

デフォルトのcompileスコープを使用する必要があります。

于 2013-01-01T17:43:44.797 に答える
0

他の人が示唆しているように、(デフォルトの)コンパイルスコープを使用して、<exclusions>不要/不要な推移的な依存関係を追加します。

参照: Maven>オプションの依存関係と依存関係の除外

于 2013-01-01T18:09:54.637 に答える
0

@Seanから提供されたリンクをたどっていましたが、私が望むことは不可能のようです。

この質問を削除することに投票しませんか?

答えはそれを行うことはできませんが、ここに理由があります:

Project-A -> Project-B

上の図は、Project-AがProject-Bに依存していることを示しています。AがBをそのPOMのオプションの依存関係として宣言する場合、この関係は変更されません。Project-Bがクラスパスに追加される通常のビルドとまったく同じです。

Project-X -> Project-A

ただし、別のプロジェクト(Project-X)がProject-AをそのPOMの依存関係として宣言すると、オプションの依存関係が有効になります。Project-BがProject-Xのクラスパスに含まれていないことに気付くでしょう。you will need to declare it directly in your POM in order for B to be included in X's classpath.

公式ドキュメントから 取得

于 2013-01-02T07:52:18.847 に答える
0

それで、あなたのXモジュールはマヴェン化されていますか?次に、を使用してローカルにインストールしmvn clean install、すべての推移的な依存関係とcompileスコープを持つ別のプロジェクトで使用できます。このケースは、自分のマシンですべてを実行するまでは問題ありません。Xコードを他の人と共有したり、他の人が利用できるpomを使用して必要なCIビルドを構成したりする場合に限ります。これを行うための最良の方法は、他のすべてのマシンからアクセスできる独自のアーティファクトを用意することです。そこにインストールして、通常のスコープXで使用しcompileます。pomに新しいリポジトリを追加するだけです。

于 2013-01-02T13:05:23.557 に答える