【问题标题】:Can Maven collect all the dependent JARs for a project to help with application deployment?Maven 可以收集项目的所有依赖 JAR 以帮助部署应用程序吗?
【发布时间】:2010-10-08 18:06:27
【问题描述】:

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

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

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

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

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

尝试抢占一些答案:

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

【问题讨论】:

    标签: java deployment maven-2 desktop-application


    【解决方案1】:

    您要调查的是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 结合使用,您可以将所有内容打包到一个独立的存档中以供分发。

    【讨论】:

    • 将此添加到我在 Eclipse 中的 pom.xml 中。什么都没有发生
    • 我必须在 Eclipse 之外下载 maven,将 /bin 文件夹添加到我的路径中,然后运行 ​​mvn dependency:copy-dependencies。是的!现在它起作用了,Maven 做了它应该做的事情!现在只需将所有 *.jar 复制到我的项目并添加到我的构建路径中
    • 也许是自最初回复以来的 9 年,但对我(Windows,Maven 3.5)来说,运行 'mvn dependency:copy-dependencies' 是工作事件,没有 pom.xml 上的新元素
    【解决方案2】:

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

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

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

    org.apache.maven.pluginsmaven-dependency-plugin2.6版本> 复制依赖项准备包复制依赖目标> 目标/类/lib junit,org.hamcrest,org.mockito,org.powermock,${project.groupId} 配置> 执行> 生成源来源目标> 目标> 执行> 执行> ${project.build.directory}配置> 插件>

    【讨论】:

      【解决方案3】:

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

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

      $ mvn dependency:copy-dependencies -DoutputDirectory=OUTPUT_DIR
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          确实可以。您需要使用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>
          

          到你的项目。

          【讨论】:

            【解决方案6】:

            使用 ma​​ven.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/
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-09-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-06-02
              相关资源
              最近更新 更多