Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Maven:如何使用包含的外部库实现可运行jar(uberjar)_Java_Maven_Jar_Runnable_Uberjar - Fatal编程技术网

Java Maven:如何使用包含的外部库实现可运行jar(uberjar)

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

到目前为止,我用Ant制作了可运行的罐子,没有任何问题。
然而,我现在尝试将我的项目专业化,我真的不知道如何使用这个工具来运行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中。嗯,这么近但是这么远。。。谢谢大家。