Dependencies Maven未正确设置依赖项的类路径

Dependencies Maven未正确设置依赖项的类路径,dependencies,maven,classpath,Dependencies,Maven,Classpath,操作系统名称:“linux”版本:“2.6.32-27-generic”arch:“i386”系列:“unix” ApacheMaven 2.2.1(r801777;2009-08-06 12:16:01-0700) Java版本:1.6.0_20 我试图在ubuntu中使用mysql依赖项和maven。如果我将maven下载的“mysql-connector-java-5.1.14.jar”文件移动到我的$java_HOME/jre/lib/ext/文件夹中,运行jar时一切正常 我认为我应该

操作系统名称:“linux”版本:“2.6.32-27-generic”arch:“i386”系列:“unix”

ApacheMaven 2.2.1(r801777;2009-08-06 12:16:01-0700)

Java版本:1.6.0_20

我试图在ubuntu中使用mysql依赖项和maven。如果我将maven下载的“mysql-connector-java-5.1.14.jar”文件移动到我的$java_HOME/jre/lib/ext/文件夹中,运行jar时一切正常

我认为我应该能够在pom.xml文件中指定依赖项,maven应该负责自动设置依赖项jar的类路径。这是不对的吗

我的pom.xml文件如下所示:


4.0.0
com.ion.common
试验准备
1.0-快照
罐子
测试准备
http://maven.apache.org
UTF-8
org.apache.maven.plugins
maven jar插件
真的
com.ion.common.App
朱尼特
朱尼特
3.8.1
测试
mysql
mysql连接器java
5.1.14
编译
命令“mvn package”构建它时没有任何问题,我可以运行它,但是当应用程序尝试访问数据库时,会出现以下错误:

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
        at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:186)
        at com.ion.common.Functions.databases(Functions.java:107)
        at com.ion.common.App.main(App.java:31)
它失败的线路是:

Class.forName("com.mysql.jdbc.Driver");

谁能告诉我我做错了什么或如何修复它吗?

Maven确实正确地将类路径设置为依赖项,但没有以存储库位置作为前缀。它在您的
清单
文件中看起来像这样

Class-Path: mysql-connector-java-5.1.14.jar
您可以将从属jar放在与正在运行的jar相同的文件夹中


请参阅

拉古兰朝正确的方向推了我一下。让maven负责自动复制JAR的方法是在pom.xml文件的标记中添加以下代码:


org.apache.maven.plugins

让maven将罐子打包在一起会很好,但这足以回答这个问题。有关stackoverflow的相关回答:


我知道这个问题很老了,但它出现在让Maven使用快照版本正确设置依赖项的搜索顶部,我必须改进已接受的解决方案以使我的类路径解析正确工作

我遇到的问题是,maven jar插件包含依赖项的resolvedVersion(例如--.jar),而maven依赖项插件(从版本2.5.1开始)复制依赖项,保留它们的基本版本--SNAPSHOT.jar)。(有关该增强功能的更多信息,请参阅。)

为了让事情顺利进行,我必须按如下方式关闭此行为:

。。。
org.apache.maven.plugins
maven jar插件
真的
依赖性/
com.example.MainClass
org.apache.maven.plugins
maven依赖插件
复制依赖项
包裹
复制依赖项
假的
...

此配置导致依赖项被复制到
${project.build.directory}/dependency
,其
resolvedVersion
与maven jar插件设置到
META-INF/MANIFEST.MF
中的blasspath相匹配。希望这对将来的人有所帮助。

或者如果您使用的是
maven shade plugin
一个解决方法是添加一个过滤器,以包含丢失的文件:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.1.0</version>
            <executions>
                <execution>
                    ...
                    <configuration>
                        ...
                        <filters>
                            ...                                
                            <filter>
                                <artifact>com.sun.istack</artifact>
                                <includes>
                                    <include>**</include>
                                </includes>
                            </filter>

org.apache.maven.plugins
maven阴影插件
3.1.0
...
...
...                                
com.sun.istack
**

谢谢,这让我更亲近了。我能够将dependency:copy dependencies目标添加到pom.xml文件中,以使maven自动处理复制依赖项的操作。+1表示指向maven assembly插件的链接。还有一个问题:它将DEP复制到哪里?我想它会把他们放在你的项目里?将它们从~/.m2复制到本地项目,但在本地项目tho?@AlexanderMills的何处,配置通过
outputDirectory
说明目标。同样常见的还有
${project.build.directory}/lib,它将所有JAR添加到一个
lib`目录中。根据bug追踪器,这个问题从版本2.6开始就得到了修复。