web-dev-qa-db-ja.com

依存関係のあるMaven 2アセンブリ:スコープ「システム」の下のjarは含まれません

次のように私はその依存関係を含め、自分のアプリケーションのjarファイルを作成するために、Mavenのアセンブリのプラグインを使用しています:

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

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

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

このjarファイルの名前が変更されるたびに、これまでただし、この力私は、ポンポンとアセンブリファイルを変更します。また、それはちょうど間違っているようです。

dependencySets<scope>runtime</scope><include>sourceforge.jchart2d:jchart2d</include>を試してみましたが、うまくいきませんでした。

それでは、どのようにMavenの2であなたのアセンブリファイルにjarファイルをスコープsystemが含まれていますか?

どうもありがとう

59

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

  • プロジェクトにローカルな「ファイルシステムリポジトリ」に依存関係を配置します。
  • このようなリポジトリを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%確信はありませんが、システムスコープを使用するよりも優れたソリューションだと思います。

更新:元の回答で言及したはずだったので、現在修正中です。ファイルベースのリポジトリにサードパーティのライブラリをインストールするには、 localRepositoryPath パラメーターを指定したinstall:install-fileを使用します。

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

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

79
Pascal Thivent

ところで、それを自動化し、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>
25
alx

Jarを作成する場合の簡単な解決策を見つける

<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>
15
mc.dev

また、dependencySetsに補足的なdependencySetを追加することでこれを処理することもできます。

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

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

ドキュメント: https://maven.Apache.org/plugins/maven-Assembly-plugin/Assembly.html

5
khmarbaise

編集: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 package

2
ykyuen

これの簡単な解決策は、ローカルのMavenリポジトリに追加することです

1つの方法は、前の投稿で提案されたmvn installコマンドを介したものです。

別の簡単な方法は、1)Eclipse ideでプロジェクトを右クリックし、Mavenオプションを選択します。 2)[アーティファクトをMavenリポジトリにインストールまたは展開]オプションを選択し、[次へ]をクリックします。 3)[アーティファクトファイル]チェックボックスの横にある参照をクリックしてjarファイルを選択します4)GroupIdとArtifactIdおよびバージョンを入力して、pomの生成とチェックサムの作成がチェックされ、パッケージがjarであることを確認

完了をクリックして、Wallah !!!ジョブが完了すると、jarはローカルリポジトリに追加され、setting.xmlまたはm2ディレクトリで定義できます。

ここで、インポートごとに入力したGroupId、ArtifactIdおよびjarバージョンごとに単純なmaven依存関係を追加するだけで、外部jarがmavenによってパッケージ化されます。

2
swapnil thorat

それは私のソリューションで簡単に機能しました:

依存関係から削除します。

<dependency>
  <groupId>tiago.medici</groupId>
  <artifactId>eureka</artifactId>
  <version>0.0.1</version>
</dependency> 

次に、maven-install-pluginもpom.xmlに追加します。

<plugin>
  <groupId>org.Apache.maven.plugins</groupId>
  <artifactId>maven-install-plugin</artifactId>
  <executions>
    <execution>
      <id>install-external</id>
      <phase>clean</phase>
      <configuration>
        <file>${basedir}/external/tiago.medici-0.0.1.jar</file>
        <repositoryLayout>default</repositoryLayout>
        <groupId>tiago.medici</groupId>
        <artifactId>eureka</artifactId>
        <version>0.0.1</version>
        <packaging>jar</packaging>
        <generatePom>true</generatePom>
      </configuration>
      <goals>
        <goal>install-file</goal>
      </goals>
    </execution>
  </executions>
</plugin>
1
Tiago Medici