【问题标题】:Maven: how to do runable jar (uberjar) with included external librariesMaven:如何使用包含外部库的可运行 jar(uber jar)
【发布时间】:2014-09-23 11:38:53
【问题描述】:

到目前为止,我使用 Ant 制作了可运行的 jar,并且没有任何问题。
但是我现在尝试 mavenize 我的项目,我真的不知道如何使用这个工具来做可运行的 jar。
我已经阅读了大量的教程(也在这里,在 Stackoverflow 上)、帮助、建议和......什么都没有。就我而言,它们都不起作用,这可能意味着我不了解一些基础知识。
我有这么简单的项目:

这是一个应用程序,使用 mysql-connector-java-5.1.24-bin.jar(放置在“lib”目录中)连接到 MySQL 数据库。
我想将此 jar 包含到最终的 jar (DBPreformatter.jar) 中。 我在许多配置中使用了汇编和着色插件,但他们从未将此 jar 添加到 DBPreformatter.jar 中。

这是我的 pom.xml:

<modelVersion>4.0.0</modelVersion>
<groupId>com.icd4you</groupId>
<artifactId>DBPreformatter</artifactId>
<version>1.0.0</version>
<name>DBPreformatter</name>
<description>DB processing and cleaning tool</description>
<packaging>jar</packaging>
<dependencies>
    <dependency>
        <groupId>mysql-connector-java-5.1.24-bin</groupId>
        <artifactId>mysql-connector-java-5.1.24-bin</artifactId>
        <version>5.1.24</version>
        <scope>system</scope>
        <systemPath>${basedir}/lib/mysql-connector-java-5.1.24-bin.jar</systemPath>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>

        <!-- WHAT SHOULD I USE HERE? -->

    </plugins>
</build>

如何解决这个问题?

【问题讨论】:

  • 将 JAR 包含在“lib”文件夹中并不是很像 maven。这个 JAR 是从哪里来的?如果您创作了它,您可以将它部署到本地存储库,然后正常引用它(即没有systemPath)。如果它是第 3 方 JAR,请尝试在线搜索 - 它可能已经在标准存储库中。
  • 连接器取自官方 mysql 站点。请记住,这是我尝试调整以适应 maven projest 的旧应用程序。无论如何,我会解决它。
  • 当然,我明白了。我只是指出,当“mavenising”时,您需要做的其中一个步骤是尽可能尝试在标准存储库中寻找依赖项。 “Lib”文件夹在 Maven 项目中不受欢迎。
  • 几乎重复的是How can I create an executable jar with dependencies using Maven?。但由于我们必须引导您解决 system 范围问题,因此我不会将其作为重复项关闭。

标签: java maven jar runnable uberjar


【解决方案1】:

有一个 maven 插件 Apache Maven Shade Plugin 会为你构建一个 uber jar

【讨论】:

  • 是的,我知道这个插件存在,但我不能在这个插件中使用这样的公式来成功实现最终 jar 的所需内部状态。总是 /lib/mysql-connector... 在“mvn clean package”期间被省略。
  • 请使用maven中心mysqlmysql-connector-java5.1.24
  • @IonCojocaru 应该是 5.1.24。
【解决方案2】:

添加Maven Assembly plugin 和描述符jar-with-dependencies

<build>
    <plugins>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <archive>
                    <manifest>
                        <mainClass>com.pany.your.MainClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

请注意,这不会添加 JAR;相反,它会解压缩所有列为依赖项的 JAR,并将它们的 content 添加到生成的 JAR(因此您将在结果中看到 MySQL JAR 中的所有类文件,而不是 MySQL JAR 本身)。

编辑 但是有一点需要注意:Maven 会忽略带有scope=system 的 JAR 以进行许多操作。另见:How to include external jars in maven jar build process?

如果 Maven 没有将 JAR 添加到输出中,那么您必须使用 mvn install:file-install 命令将具有此范围的所有 JAR 安装到本地 maven 存储库 ($HOME/.m2/repository) 中。请参阅http://maven.apache.org/plugins/maven-install-plugin/usage.html 怎么做。

注意:在本地 repo 中安装库是首选方式;你真的应该考虑一下。一方面,scope=system 将不再让您感到困惑(因为许多插件以特殊方式处理它们)。另外,您只需执行一次。之后,您可以在许多 Maven 项目中使用该库。

在安装之前,您应该检查 http://search.maven.org/ 以查看 Maven 是否不知道依赖项。

MySQL 是:http://search.maven.org/#artifactdetails%7Cmysql%7Cmysql-connector-java%7C5.1.32%7Cjar

【讨论】:

  • 确实我期待一些罐子。我可以以某种方式引导这个解包的目的地吗?例如。如果我在 /lib 目录中有多个 jar 文件,我想将它们解压缩到 DBPreformatter.jar/lib 中。
  • @rainbow 为什么要关心文件在 JAR 中的显示方式?这个答案描述了生成可执行 JAR 的正常方法。您还有其他未与我们分享的要求吗?
  • 在这个项目中:没有。但是,如果我能成功地对这个进行 mavenize,我将尝试使用另一个在他的“lib”目录中有许多额外库的库。
  • @rainbow:不要使用scope=system。查看我的修改以获得更好的解决方案。
  • @Aaron 是的!这是批评性的评论。实际上,在从 maven 存储库中删除 scope=system/using repo 之后(就像 Duncan 提到的那样),shade 插件已正确嵌入 mysql-connector 到 DBPreformatter.jar 中。呃,这么近,但这么远……谢谢大家。
猜你喜欢
  • 2018-01-31
  • 2011-02-24
  • 2011-09-18
  • 1970-01-01
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
  • 2012-03-03
相关资源
最近更新 更多