55

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

因为这是一个独立的 Java 应用程序,所以我对部署到 Maven 存储库感兴趣,这也相当简单,或者至少很容易在 google 上搜索。

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

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

然后,无论我myApp.jar的.installLocation$CLASSPATH

尝试抢占一些答案:

  • 我确实有一个 Main-class: 设置,它工作正常。
  • 我还在 MANIFEST.MF 中设置了类路径,这也很好。
  • 我已经找到了如何使用<classpathPrefix><classpathMavenRepositoryLayout>完成这项工作——但仅限于我的机器上。(通过<classpathPrefix>${settings.localRepository}</classpathPrefix>:)
4

6 回答 6

84

您要调查的是Maven 的依赖插件。在 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复制执行复制。将此与程序集插件结合使用,您可以将所有内容打包到一个自包含的存档中以进行分发。

于 2009-02-20T04:03:42.747 回答
9

我不关心 Shade 插件,因为它将所有 jar 中的所有包滚动在一起。

要包含所有外部库,您可以使用上面提到的依赖插件。

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

<插件>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <版本>2.6</版本>
  <执行>
    <执行>
      <id>复制依赖项</id>
      <phase>准备包</phase>
      <目标>
        <goal>复制依赖</goal>
      </目标>
      <配置>
        <outputDirectory>目标/类/lib</outputDirectory>
        <overWriteIfNewer>真</overWriteIfNewer>
        <excludeGroupIds>
          junit,org.hamcrest,org.mockito,org.powermock,${project.groupId}
        </excludeGroupIds>
      </配置>
    </执行>
    <执行>
      <phase>生成源</phase>
      <目标>
        <目标>来源</目标>
      </目标>
    </执行>
  </执行>
  <配置>
    <verbose>真</verbose>
    <detail>真</detail>
    <outputDirectory>${project.build.directory}</outputDirectory>
  </配置>
</插件>
于 2013-02-01T22:32:54.327 回答
9

看看 maven 的依赖插件,特别是 copy-dependencies 目标。使用部分描述了如何做你想要的。

要从命令行执行此操作,只需执行以下操作:

$ mvn dependency:copy-dependencies -DoutputDirectory=OUTPUT_DIR
于 2015-12-16T09:03:46.677 回答
7

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

于 2009-02-20T21:44:33.103 回答
2

它肯定可以。您需要使用可以通过添加来完成的阴影插件

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

到你的项目。

于 2009-02-20T02:58:23.247 回答
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/
于 2016-08-17T15:05:53.880 回答