Maven可以为项目收集所有依赖JAR以帮助进行应用程序部署吗?

时间:2009-02-20 01:50:38

标签: java deployment maven-2 desktop-application

我刚刚开始使用Maven,(实际评估它),我需要能够为我的应用程序和包含所有依赖项的目录快速生成JAR文件(用于例如,lib)以便我可以部署这两个以独立方式运行。使用正确的清单生成JAR文件很简单,但我不知道如何让Maven将当前项目的依赖项复制到我可以部署的lib目录中。

由于这是针对独立的Java应用程序,我对部署到Maven存储库感兴趣,这也非常简单,或者至少可以轻松地进行googleable。

我已经找到了如何做所有除了将依赖的JAR文件复制到某个指定的目录中。这是我正在寻找的工作流程:

$ mvn clean
$ mvn package
$ cp -r target/{lib,myApp.jar} installLocation

然后,无论我的myApp.jar如何,从installLocation作为JAR文件运行$CLASSPATH都应“正常工作”。

试图抢先一些答案:

  • 我有一个Main-class:set,它工作正常。
  • 我还在MANIFEST.MF中设置了类路径,这也很好。
  • 我发现了如何使用<classpathPrefix><classpathMavenRepositoryLayout>来完成这项工作 - 但仅限于我的计算机上。 (来自:<classpathPrefix>${settings.localRepository}</classpathPrefix>

6 个答案:

答案 0 :(得分:81)

您要调查的是Maven's dependency plugin。在pom.xml中添加类似于以下的内容:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <configuration>
        <outputDirectory>
            ${project.build.directory}
        </outputDirectory>
    </configuration>
</plugin>

然后运行mvn clean dependency:copy-dependencies复制执行副本。将其与assembly plugin结合使用,您可以将所有内容打包到一个自包含的存档中进行分发。

答案 1 :(得分:9)

我不关心Shade插件,因为它将所有包装中的所有包装卷起来。

要包含所有外部库,您可以使用上面提到的Dependency Plugin。

此示例将在“package”阶段之前的“target / classes”下创建一个“lib”目录。

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <version>2.6</version>
  <executions>
    <execution>
      <id>copy-dependencies</id>
      <phase>prepare-package</phase>
      <goals>
        <goal>copy-dependencies</goal>
      </goals>
      <configuration>
        <outputDirectory>target/classes/lib</outputDirectory>
        <overWriteIfNewer>true</overWriteIfNewer>
        <excludeGroupIds>
          junit,org.hamcrest,org.mockito,org.powermock,${project.groupId}
        </excludeGroupIds>
      </configuration>
    </execution>
    <execution>
      <phase>generate-sources</phase>
      <goals>
        <goal>sources</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <verbose>true</verbose>
    <detail>true</detail>
    <outputDirectory>${project.build.directory}</outputDirectory>
  </configuration>
</plugin>

答案 2 :(得分:7)

还有一个是appassembler plugin 我喜欢它的是它将应用程序打包成一个可以使用的形式(带有.bat文件等)

答案 3 :(得分:4)

看一下maven的依赖插件,特别是copy-dependencies目标。用法部分描述了如何完全按照自己的意愿进行操作。

要从命令行执行此操作:

$ mvn dependency:copy-dependencies -DoutputDirectory=OUTPUT_DIR

答案 4 :(得分:3)

肯定可以。您需要使用shade plugin,可以通过添加

来完成
     <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>1.3-SNAPSHOT</version>
        <configuration>
          <!-- put your configurations here -->
        </configuration>
      </plugin>

到你的项目。

答案 5 :(得分:0)

使用 maven.repo.local 可以收集所有jar,但是,它们被收集到具有maven层次结构(.m2)的目录中。

mvn install -Dmaven.repo.local=./pick/some/folder

然后你可以收集它们(在Linux上):

mkdir flat-repo
find ./pick/some/folder -type f -name "*.jar" | xargs -I'{}' cp '{}' flat-repo/