Mavenに依存関係をtarget / libにコピーさせる


252

プロジェクトのランタイム依存関係をtarget/libフォルダーにコピーするにはどうすればよいですか?

それが今であるため、後にフォルダだけ私のプロジェクトのjarファイルが含まれていませんが、実行時の依存関係のどれも。mvn clean installtarget


なぜこれが必要なのですか?あなたのmavenプロジェクトのタイプは何ですか?瓶?
Alexandre Victoor 2008

私のmavenプロジェクトのタイプはJARです。多くの依存関係があり、jarを実行可能ファイルとしてデプロイしようとしているので、これが必要です。
マイケル

2
アセンブリに関する注意-dep間でパッケージ/クラスが重複している場合、おそらく悪い時間になるでしょう。
demaniak

回答:


260

これは私にとってはうまくいきます:

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

11
これを常に実行したい場合は、<profiles> ... <profile>ラッパーを削除し、<build>タグを<project>のすぐ下に配置します
Dan Halbert

3
これは、/ libにjarファイルをCOYが、コンパイル済みのプロジェクト内のクラスが含まれません@Georgy
Midhat

5
これは問題ありませんが、テストの依存関係もコピーしています。私は自分にexcludeScopeオプションを追加します(maven.apache.org/plugins/maven-dependency-plugin/…)。
Alfonso Nishikawa

うまく機能しますが、ビルドタグをプロファイルタグ内に配置する必要はありません。
Julien BRENELIERE 2014

2
注:ノード<excludeScope>test</excludeScope>内に入りconfigurationます。
ジェシーチザム

84

最善のアプローチは、何をしたいかによって異なります。

  • 依存関係をWARまたはEARファイルにバンドルする場合は、プロジェクトのパッケージ化タイプをEARまたはWARに設定するだけです。Mavenは依存関係を適切な場所にバンドルします。
  • すべての依存関係とともにコードを含むJARファイルを作成する場合は、jar-with-dependencies記述子を含むアセンブリプラグインを使用します。Mavenは、すべてのクラスと依存関係のクラスを含む完全なJARファイルを生成します。
  • 単純に依存関係をインタラクティブにターゲットディレクトリにプルする場合は、依存関係プラグインを使用してファイルをコピーします。
  • 他のタイプの処理の依存関係を取得したい場合は、おそらく独自のプラグインを生成する必要があります。依存関係のリストとそれらのディスク上の場所を取得するAPIがあります。あなたはそこからそれを取る必要があります...

80
mvn install dependency:copy-dependencies 

ターゲットフォルダに作成された依存関係ディレクトリで私のために動作します。いいね!


35

見てみましょうMavenの依存関係のプラグインは、具体的には、依存関係を:コピーの依存関係の目標を。見出し「dependency:copy-dependencies mojo」のの例を見てください。設定しOUTPUTDIRECTORY $ {BASEDIR} /ターゲット/ libにする構成プロパティを(私は信じて、あなたがテストする必要があります)。

お役に立てれば。


15
または、$ {basedir} / target / libではなく$ {project.build.directory} / libを使用することもできます
Cuga

31

Mavenの他のフェーズを使用せずに依存関係をターゲットディレクトリにコピーする必要がある場合のシンプルでエレガントなソリューション(これはVaadinを操作するときに非常に便利です)。

完全なpomの例:

<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/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>groupId</groupId>
    <artifactId>artifactId</artifactId>
    <version>1.0</version>

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.1.1</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-dependency-plugin</artifactId>
                    <executions>
                        <execution>
                            <phase>process-sources</phase>

                            <goals>
                                <goal>copy-dependencies</goal>
                            </goals>

                            <configuration>
                                <outputDirectory>${targetdirectory}</outputDirectory>
                            </configuration>
                        </execution>
                    </executions>
            </plugin>
        </plugins>
    </build>
</project>

次に実行します mvn process-sources

jarファイルの依存関係は次の場所にあります /target/dependency


1
maven-dependency-plugin(目標 "copy-dependencies"、 "unpack")はm2eではサポートされていません。:-(
午後12

@Gobliinsは$ {targetdirectory}の代わりに$ {project.build.directory} / libを使用します
Divyang Shah

24

これをときどき行いたい(したがってPOMを変更したくない)場合は、次のコマンドラインを試してください。

mvn dependency:copy-dependencies -DoutputDirectory = $ {project.build.directory} / lib

最後の引数を省略すると、依存関係はに配置されtarget/dependenciesます。


ありがとう!これは、プロジェクトに必要なライブラリをどこかのフォルダにコピーする最も簡単な方法です。たとえば、非Mavenベースのプロジェクトなど、必要に応じてそれらをどこかにコピーできます。もちろん、ハードコードされたフォルダを渡すだけで、必要に応じて使用できます。たとえばmvn dependency:copy-dependencies -DoutputDirectory=./lib
Brad Parks

pom.xmlから実行できますか?
Gobliins、2015年

24

このようなものを試してください:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
    <archive>
        <manifest>  
            <addClasspath>true</addClasspath>
            <classpathPrefix>lib/</classpathPrefix>
            <mainClass>MainClass</mainClass>
        </manifest>
    </archive>
    </configuration>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.4</version>
    <executions>
        <execution>
            <id>copy</id>
            <phase>install</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>
                    ${project.build.directory}/lib
                </outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

私はそれがだと思う@Thomas maven clean install、あなたは見つけるでしょうlibtarget
Searene

1
1つの依存関係のみをコピーするにはどうすればよいですか?
アランDonizete

<classpathPrefix> lib / </ classpathPrefix>は私を大きく助けてくれました。ありがとうございました!
Martin Pabst 2017

目標を実行する前に依存関係がコピーされるようにinstallフェーズを置き換えますprocess-resourcesbuild
Vyacheslav Cotruta

20

必要なのは、pom.xml内の次のスニペットだけですbuild/plugins

<plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <phase>prepare-package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/lib</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

上記は、実行するpackageフェーズで実行されます

mvn clean package

そして、依存関係はスニペットで指定されたoutputDirectoryにコピーされます(つまりlib、この場合)。

たまにそれをしたいだけなら、pom.xmlを変更する必要はありません。以下を実行するだけです:

mvn clean package dependency:copy-dependencies

デフォルトの場所を、無効にするには${project.build.directory}/dependencies、システムプロパティを追加するという名前のoutputDirectory、すなわち

    -DoutputDirectory=${project.build.directory}/lib

7

と思います

  • pom.xmlを変更したくない
  • テストスコープ(junit.jarなど)または提供された依存関係(wlfullclient.jarなど)を必要としない

ここに私のために働いたものがあります:

mvn install dependency:copy-dependencies -DincludeScope = runtime -DoutputDirectory = target / lib

5

アプリケーションjarのバンドルを、そのすべての依存関係およびMainClassを呼び出すためのいくつかのスクリプトと共に配信する場合は、appassembler-maven-pluginを確認してください

次の構成は、アプリケーションを起動するためのウィンドウとLinux用のスクリプトを生成します(すべての依存関係jarを参照する生成されたパスを使用して、すべての依存関係を(target / appassemblerの下のlibフォルダーに)ダウンロードします。その後、アセンブリプラグインを使用して全体をパッケージ化できますappassemblerディレクトリをzipに、jarとともにリポジトリにインストール/デプロイします。

  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>appassembler-maven-plugin</artifactId>
    <version>1.0</version>
    <executions>
      <execution>
        <id>generate-jsw-scripts</id>
        <phase>package</phase>
        <goals>
          <goal>generate-daemons</goal>
        </goals>
        <configuration>
          <!--declare the JSW config -->
          <daemons>
            <daemon>
              <id>myApp</id>
              <mainClass>name.seller.rich.MyMainClass</mainClass>
              <commandLineArguments>
                <commandLineArgument>start</commandLineArgument>
              </commandLineArguments>
              <platforms>
                <platform>jsw</platform>
              </platforms>              
            </daemon>
          </daemons>
          <target>${project.build.directory}/appassembler</target>
        </configuration>
      </execution>
      <execution>
        <id>assemble-standalone</id>
        <phase>integration-test</phase>
        <goals>
          <goal>assemble</goal>
        </goals>
        <configuration>
          <programs>
            <program>
              <mainClass>name.seller.rich.MyMainClass</mainClass>
              <!-- the name of the bat/sh files to be generated -->
              <name>mymain</name>
            </program>
          </programs>
          <platforms>
            <platform>windows</platform>
            <platform>unix</platform>
          </platforms>
          <repositoryLayout>flat</repositoryLayout>
          <repositoryName>lib</repositoryName>
        </configuration>
      </execution>
    </executions>
  </plugin>
  <plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2-beta-4</version>
    <executions>
      <execution>
        <phase>integration-test</phase>
        <goals>
          <goal>single</goal>
        </goals>
        <configuration>
          <descriptors>
            <descriptor>src/main/assembly/archive.xml</descriptor>
          </descriptors>
        </configuration>
      </execution>
    </executions>
  </plugin> 

ディレクトリをzipとしてパッケージ化するためのアセンブリ記述子(src / main / assembly)は次のようになります。

<assembly>
  <id>archive</id>
  <formats>
    <format>zip</format>
  </formats>
  <fileSets>
    <fileSet>
     <directory>${project.build.directory}/appassembler</directory>
     <outputDirectory>/</outputDirectory>
    </fileSet>
  </fileSets>
</assembly>



1

すでに簡潔に述べられていることを説明するためだけに。コードと一緒に依存関係を含む実行可能JARファイルを作成したいと思いました。これは私のために働きました:

(1)pomの<build> <plugins>の下に、以下を含めました:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2-beta-5</version>
    <configuration>
        <archive>
            <manifest>
                <mainClass>dk.certifikat.oces2.some.package.MyMainClass</mainClass>
            </manifest>
        </archive>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
</plugin>

(2)mvn compile assembly:assemblyを実行すると、プロジェクトのターゲットディレクトリに目的のmy-project-0.1-SNAPSHOT-jar-with-dependencies.jarが生成されました。

(3)java -jar my-project-0.1-SNAPSHOT-jar-with-dependencies.jarを使用してJARを実行しました


(3)にメインクラスが見つからない
Thomas

1

それは重い依存関係を埋め込むための重い解決策ですが、Mavenのアセンブリプラグインが私にとってはトリックを行います。

@ リッチセラーの答えは機能するはずですが、より単純なケースでは、使用ガイドからのこの抜粋のみが必要です:

<project>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.2.2</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

コード例は問題を解決しません。すべてを1つのJARにバンドルするだけです。はい、この目的を達成するためにアセンブリプラグインを使用できますが、このようなことはできません。
Duncan Jones、

ただし、さらに読むと、このコメントに応答している可能性があります。
Duncan Jones

あまりにも長いので、本当に覚えていません。それに加えて、最後の会社でLinux管理に集中して以来、かなり錆びてきました。フィードバックをありがとうございます。
RubyTuesdayDONO 2014

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.