3

たとえば、BukkitApi jarを、depenecyスコープがprovided、compile、system、runtime、またはtestに設定されたmavenプロジェクトの依存関係にした場合

bukkitAPIはどのスコープにコンパイルされた出力に含まれますか?

4

2 に答える 2

7

短いバージョン:デフォルトでは、maven出力(デフォルトtargetディレクトリ内)には、現在のプロジェクト/モジュールのコンパイル済みコード以外は何も含まれていません。つまり、依存関係からは何もありません。

Long(er)バージョン:デフォルトjarのパッケージで、カスタムフェーズ構成はありません。これが、JavaプロジェクトでのMavenの動作です。

  1. compileフェーズ:ディレクトリ内のファイル.javasrc/main/java/ディレクトリ内のファイルにコンパイルされ.classesますtarget。スコープの依存関係は、compileローカルリポジトリにダウンロードされます。
  2. フェーズ:1とpackage同じですが、ディレクトリにjarファイルがありますtarget
  3. installフェーズ:2と同じように、ローカルリポジトリにファイルを取得しますjar

したがって、.jar依存関係からのファイルはデフォルトでは何にも含まれていません!

では、「出力」に依存関係を含めるにはどうすればよいですか?また、それらのスコープはどういう意味ですか?

たとえば、assemblyプラグインを使用してフェーズの出力に依存関係を含めると( Mavenを使用したjarに依存関係を含めるをpackage参照)、通常は次のデフォルトの動作が得られます。

  • provided: 含まれていない
  • compile(デフォルト):含まれています
  • system: 含まれていない
  • runtime:含まれています
  • test: 含まれていない

このリンクを参照してください。

編集:に異なるスコープ値を使用してこのpomを試してみると、スコープがandguiceの場合に依存関係が含まれていることがわかります(この例ではソースファイルは必要ありません)fake-1.0-SNAPSHOT-jar-with-dependencies.jarcompileruntime

<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.linagora</groupId>
    <artifactId>fake</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>fake</name>
    <dependencies>
        <dependency>
            <groupId>com.google.inject</groupId>
            <artifactId>guice</artifactId>
            <version>2.0</version>
            <scope>compile</scope>
            <!-- system scope needs 'systemPath' attribute as well
                <systemPath>/path/to/guice/guice-3.0.jar</systemPath>
                <scope>system</scope>
            -->
            <!-- <scope>runtime</scope> -->
            <!-- <scope>test</scope> -->
            <!-- <scope>provided</scope> -->

        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
于 2012-11-23T14:55:41.233 に答える
3

それはMavenの仕組みではありません。依存関係は、クラスパス(コンパイル、実行時、テスト用)を指定するだけです。ただし、依存関係はデフォルトでは出力に含まれていません。すべての依存関係jar(少なくともスコープコンパイルとランタイムを備えたもの)を出荷する必要があります。

依存関係プラグインを見てください。依存関係をコピーするための目標を提供します。

出荷用のバンドルを作成するには、アセンブリプラグインを確認します(たとえば、zipファイルを作成します)。それがあなたが求めているものであれば、それはオールインワンの瓶を作成する方法さえ提供します。

于 2012-11-23T14:40:33.633 に答える