2012-02-21 18 views
22

私はMavenを使用してコンパイルとテストを行うライブラリを使用しています。
ライブラリを問題なくコンパイルできました。コンパイル中は、ライブラリのすべての依存関係をダウンロードしたように見えました。Mavenベースの依存関係の推移依存関係を非Mavenプロジェクトのクラスパスに集める

今、私は自分のプロジェクトでライブラリを使用しようとしています。ライブラリをコンパイルすると、targetというフォルダがライブラリフォルダに作成され、そのフォルダ内にclassesという別のフォルダが作成されていました。私はclassesフォルダをクラスパスに追加しました。しかし、Mavenを使用しないプロジェクトでそのライブラリを使用しようとするたびに、そのライブラリの依存関係を見つけることができないと言われています。

ライブラリの依存関係をすべてクラスパスに追加するにはどうすればよいですか?
すべてのライブラリの依存関係を手動でダウンロードしてクラスパスに追加する必要がありますか?
私はMavenにそれをさせることができますか?
私のプロジェクトでライブラリを使用するためには、何が必要なのですか?

私のプロジェクトは、ライブラリとは完全に別のディレクトリにあります。今、私のプロジェクトは、ライブラリのファイルを正しく読み込むことができるようですが、ライブラリの依存関係は正しくありません。

+4

+1非常に重要な質問です。 –

答えて

14

そのライブラリにmvn installを実行すると、jarファイルが作成され、target/libaryname-version.jarに設定されているはずです。 classesフォルダの内容ではなく、この最終的なjarファイルに依存する方がよいでしょう。 Mavenには、プロジェクトのすべての依存関係をダウンロードするという目標もあります。あなたはライブラリフォルダの中に

mvn dependency:copy-dependencies 

を実行することができ、それがtarget/dependencyに、すべての依存関係のjarファイルをコピーします。デフォルトでは、テストにのみ必要なジャーが含まれていて、使用できるものを除外します。

mvn dependency:copy-dependencies -DincludeScope=runtime 
+2

クールなハック!それは私のために働いたが、私の必要性は少し異なっていた。私の場合、クラスパスを取得するだけで十分でした。クラスパスを生成し、後で使用できるリソース内のファイルに出力することができます。コードはここにある ' \t \t \t \t org.apache.maven.plugins \t \t \t \t Mavenの依存性 - プラグイン \t \t \t \t 生成-源をビルドクラスパス<設定> \t \t \t $ {project.basedir}/src/main/resourc es/classpath ' – raxith

+0

@raxithコードセクションは長すぎて解釈できません。 –

+0

@JörnHorstmannしたがって、コピー依存性の目標を実行した後、コードを実行するには、プロジェクトフォルダから 'java -cp 'ターゲット\ *; target \ dependency \ *" com.myCompany.App'を実行する必要がありますか? –

4

さて、仕事場にはいくつか問題があります。 Mavenは、あなたのライブラリをビルドしてダウンロードするのに必要なすべての依存関係を調べるのは難しい作業です。これらの依存関係はMavenリポジトリ(<user home>/.m2/repository)にローカルに保存されますが、アセンブリの一部として必要とされない限り、targetフォルダにはありません。少なくとも、デフォルトではありません。あなたの上に示したPOMの変更により

<project> 
... 
    <profiles> 
     <profile> 
      <id>qa</id> 
      <build> 
       <plugins> 
        <plugin> 
         <artifactId>maven-dependency-plugin</artifactId> 
          <executions> 
           <execution> 
            <phase>install</phase> 
            <goals> 
             <goal>copy-dependencies</goal> 
            </goals> 
            <configuration> 
             <outputDirectory>${project.build.directory}/lib</outputDirectory> 
            </configuration> 
           </execution> 
          </executions> 
        </plugin> 
       </plugins> 
      </build> 
     </profile> 
    </profiles> 
</project> 

今、すべてのJARを得ることができる必要があります:あなたが最初に行うために必要なのは(このPOMの抜粋がanother SO postからcribbedた)buildフォルダ内のすべての依存関係を保存するためにMavenを取得することですあなたのライブラリに必要な依存関係をクラスパスに含めます(target/libから)。 targetフォルダは、Mavenビルドライブラリのcleanゴールを実行するたびにヌークされるため、ワークステーションの別のフォルダにそれらをコピーすることをお勧めします。

今、すべてのことを言って、あなたのプロジェクトにもMavenを使用するように調整してみませんか?次に、トップレベルのJARをPOMに依存するものとして含め、Mavenはすべてのサブ依存関係を処理します。結局のところ、これはMavenのパワーです。それを活用することがあなたの利点です。

いずれの場合でも、どちらの方法を選択しても幸いです。