Java Maven:如何使用包含的外部库实现可运行jar(uberjar)
到目前为止,我用Ant制作了可运行的罐子,没有任何问题。Java Maven:如何使用包含的外部库实现可运行jar(uberjar),java,maven,jar,runnable,uberjar,Java,Maven,Jar,Runnable,Uberjar,到目前为止,我用Ant制作了可运行的罐子,没有任何问题。 然而,我现在尝试将我的项目专业化,我真的不知道如何使用这个工具来运行jar。 我已经阅读了大量的教程(也在这里,关于Stackoverflow)、帮助、建议和。。。没有什么。就我而言,它们都不起作用,这可能意味着我不了解一些基本知识。 我有这样一个简单的项目: 这是一个应用程序,它使用mysql-connector-java-5.1.24-bin.jar(放在'lib'目录中)连接到mysql数据库。 我想将这个jar包含到最后一个ja
然而,我现在尝试将我的项目专业化,我真的不知道如何使用这个工具来运行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>
4.0.0
com.icd4you
数据库预格式化
1.0.0
数据库预格式化
数据库处理和清理工具
罐子
mysql-connector-java-5.1.24-bin
mysql-connector-java-5.1.24-bin
5.1.24
系统
${basedir}/lib/mysql-connector-java-5.1.24-bin.jar
org.apache.maven.plugins
maven编译器插件
3.1
1.7
1.7
如何解决这个问题?有一个maven插件,它将为您构建一个uber jar添加描述符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>
如果Maven没有将JAR添加到输出中,那么必须使用mvn install:file install
命令将具有此作用域的所有JAR安装到本地Maven repo($HOME/.m2/repository
)中。看看怎么做
注意:在本地repo中安装库是首选方式;你真的应该考虑一下。首先,scope=system
将不再让您感到困惑(因为许多插件以一种特殊的方式处理它们)。而且你只需要做一次。之后,您可以在许多Maven项目中使用该库
在安装之前,您应该检查Maven是否还不知道依赖关系
MySQL是:是的,我知道这个插件存在,但我不能在这个插件中使用这样的公式来成功地实现最终jar的预期内部状态。始终使用/lib/mysql连接器。。。是在“mvn clean package”期间安装的。请使用maven central mysql连接器java 5.1.24@IonCojocaru应该是5.1.24。maven不太喜欢在“lib”文件夹中包含JAR。这个罐子是从哪里来的?如果是您编写的,则可以将其部署到本地存储库,然后正常引用(即不使用systemPath
)。如果它是一个第三方JAR,试着在线搜索它——它可能已经在一个标准的存储库中了。事实上,这看起来很像:Connector是从官方mysql站点获取的。请记住,这是一个旧的应用程序,我试图调整到maven projest。不管怎样,我会修好的。当然,我明白。我只是指出,当“mavenising”时,您需要做的一个步骤是尽可能在标准存储库中查找依赖项。在Maven项目中,“Lib”文件夹是不受欢迎的。但由于我们必须引导您绕过系统
范围问题,因此我不会将其作为重复关闭。事实上,我预期会出现一些JAR。我能告诉你这个拆包的目的地吗?如果我在/lib目录中有多个jar文件,我想将它们解压到DBPreformatter.jar/lib中。@为什么您关心这些文件在jar中的显示方式?这个答案描述了生成可执行JAR的正常方法。您是否有其他未与我们共享的需求?在本项目中:没有。但如果我能成功地将此需求变为mavenize,我将尝试另一个在其“lib”目录中有许多附加lib的需求。@rainbow:不要使用scope=system
。查看我的编辑以获得更好的解决方案。@Aaron是的!这是一句批评的话。事实上,在从maven repository中删除scope=system/using repo(就像Duncan提到的那样)之后,shade插件已经正确地将mysql连接器嵌入到DBPreformatter.jar中。嗯,这么近但是这么远。。。谢谢大家。