64

私は maven-assembly プラグインを使用して、次のような依存関係を含むアプリケーションの jar を作成しています。

<assembly>
    <id>macosx</id>
    <formats>
       <format>tar.gz</format>
       <format>dir</format>
    </formats>
    <dependencySets>
        <dependencySet>
            <includes>
                <include>*:jar</include>
            </includes>
            <outputDirectory>lib</outputDirectory>
        </dependencySet>
    </dependencySets>
</assembly>

(質問に関係のない他のものは省略しました)

libこれまでのところ、すべての依存関係を持つディレクトリが作成されるため、これはうまく機能しています。ただし、スコープが である新しい依存関係を最近追加しましたが、それは出力ディレクトリsystemにコピーされません。libここで何か基本的なことが欠けているに違いないので、助けを求めます。

追加した依存関係は次のとおりです。

<dependency>
  <groupId>sourceforge.jchart2d</groupId>
  <artifactId>jchart2d</artifactId>
  <version>3.1.0</version>
  <scope>system</scope>
  <systemPath>${project.basedir}/external/jchart2d-3.1.0.jar</systemPath>
</dependency>

この依存関係を含めることができた唯一の方法は、アセンブリ要素に次を追加することでした。

<files>
    <file>
        <source>external/jchart2d-3.1.0.jar</source>
        <outputDirectory>lib</outputDirectory>
    </file>
</files>

ただし、これにより、このjarの名前が変更されるたびに、pomとアセンブリファイルを変更する必要があります。また、それは間違っているようです。

私はで試してみまし<scope>runtime</scope>たが、運がありませんでしたdependencySets<include>sourceforge.jchart2d:jchart2d</include>

systemでは、maven 2 のアセンブリ ファイルにスコープ付きの jar をどのように含めますか?

どうもありがとう

4

7 に答える 7

90

システム スコープの依存関係が追加されていないことに驚きはありません (結局、システム スコープの依存関係は、定義によって明示的に提供する必要があります)。実際、その依存関係をローカル リポジトリに置きたくない場合 (たとえば、プロジェクトの一部として配布したい場合など)、私は次のようにします。

  • プロジェクトのローカルな「ファイル システム リポジトリ」に依存関係を配置します。
  • 私は次のpom.xmlようにそのリポジトリを宣言します:

    <repositories>
      <repository>
        <id>my</id>
        <url>file://${basedir}/my-repo</url>
      </repository>
    </repositories>
    
  • スコープなしでアーティファクトを宣言するだけsystemです。これは単なるトラブルの原因です。

    <dependency>
      <groupId>sourceforge.jchart2d</groupId>
      <artifactId>jchart2d</artifactId>
      <version>3.1.0</version>
    </dependency>
    

これがあなたのニーズに 100% 合うかどうかはわかりませんが、システム スコープを使用するよりも優れたソリューションだと思います。

更新:元の回答でそれを言及する必要があり、現在修正中です。ファイルベースのリポジトリにサードパーティ ライブラリをインストールするには、次のパラメータを使用install:install-fileします。localRepositoryPath

mvn install:install-file -Dfile=<path-to-file> \
                         -DgroupId=<myGroup> \
                         -DartifactId=<myArtifactId> \
                         -Dversion=<myVersion> \
                         -Dpackaging=<myPackaging> \
                         -DlocalRepositoryPath=<path-to-my-repo>

これをそのまま *nix シェルに貼り付けることができます。Windows では、" \" を削除し、すべてを 1 行にまとめます。

于 2010-01-14T22:43:52.220 に答える
25

ところで、それを自動化して、Maven ビルドの一部にすることができます。以下は、コンパイル前に jar をローカル リポジトリにインストールします。

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <executions>
                <execution>
                    <id>hack-binary</id>
                    <phase>validate</phase>
                    <configuration>
                        <file>${basedir}/lib/your-lib.jar</file>
                        <repositoryLayout>default</repositoryLayout>
                        <groupId>your-group</groupId>
                        <artifactId>your-artifact</artifactId>
                        <version>0.1</version>
                        <packaging>jar</packaging>
                        <generatePom>true</generatePom>
                    </configuration>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
于 2010-04-10T09:45:47.903 に答える
16

あなたが瓶を作成する場合の簡単な解決策を見つけます

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-war-plugin</artifactId>
  <version>2.1.1</version>
  <configuration>
    <webResources>
    <resource>
      <directory>dependencies/mydep</directory>
        <targetPath>WEB-INF/lib</targetPath>
        <filtering>true</filtering>
        <includes>
           <include>**/*.jar</include>
        </includes>
    </resource>
  </webResources>
</configuration>
</plugin>
于 2011-11-03T06:12:08.950 に答える
5

また、依存関係セットに補助的な依存関係セットを追加することで、これを処理することもできます。

<dependencySet>
  <scope>system</scope>
  <includes>
    <include>*:jar</include>
  </includes>
  <outputDirectory>lib</outputDirectory>
</dependencySet>

最善の方法は、Repository Manager (Nexus、Artifactory、Archiva など) を使用して、この種の依存関係を特定のリポジトリにインストールすることです。その後、単純な依存関係などを使用できます。これはあなたの人生を簡素化します。

ドキュメント:

于 2011-11-03T06:41:43.363 に答える
2

編集済み: 申し訳ありませんが、alx がクリーン ライフ サイクルの回避策についても言及していることに気付きませんでした。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-install-plugin</artifactId>
    <executions>
        <execution>
            <id>hack-binary</id>
            <phase>clean</phase>
            <configuration>
                <file>${basedir}/lib/your-lib.jar</file>
                <repositoryLayout>default</repositoryLayout>
                <groupId>your-group</groupId>
                <artifactId>your-artifact</artifactId>
                <version>0.1</version>
                <packaging>jar</packaging>
                <generatePom>true</generatePom>
            </configuration>
            <goals>
                <goal>install-file</goal>
            </goals>
        </execution>
    </executions>
</plugin>

alx が提供するソリューションに基づいて、インストール ファイルのステップをクリーン フェーズで実行できます。mvn cleanただし、クリーン フェーズはデフォルトのライフ サイクルではないため、ローカル リポジトリで jar の準備が整っていることを確認するために、最初に実行する必要があります。

例: mvn clean; mvn パッケージ

于 2014-06-05T08:26:49.867 に答える