Maven异常NoClassDefFoundError ClassNotFoundException但Maven依赖项存在命令行

时间:2019-05-27 04:26:04

标签: java maven

我在遇到Maven问题。我在pom.xml中包含了这样的依赖项:

<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-csv</artifactId>
  <version>1.6</version>
</dependency>

我将Intellij用作IDE,并且在那里没有任何编译警告。我正在使用命令行运行maven命令,并且我可以毫无困难地运行mvn install compile package

但是,当我尝试像这样运行jar时:

java -cp target/stride-1.0-SNAPSHOT.jar com.myapp.maven.App

我收到此错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/csv/CSVFormat
    at com.stride.maven.App.parseCsv(App.java:43)
    at com.stride.maven.App.main(App.java:25)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.csv.CSVFormat
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

显然,maven无法找到该路径。我尝试删除.m2,进行重建,以及大部分在stackoverflow上找到的所有内容,但是我找不到问题,也无法了解问题。注意,在我的Intellij中,我可以在外部库中看到依赖关系。

我还尝试使用阴影将依赖项复制到jar中:

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
      <executions>
        <execution>
          <goals>
            <goal>shade</goal>
          </goals>
          <configuration>
            <shadedArtifactAttached>true</shadedArtifactAttached>
            <transformers>
              <transformer implementation=
                                   "org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                <mainClass>com.myapp.maven.App</mainClass>
              </transformer>
            </transformers>
          </configuration>
        </execution>
      </executions>
    </plugin>

接下来,我重新运行mvn clean install软件包,然后重新构建命令。没有运气。

我也尝试过Maven Assembly插件。猜怎么着,没有运气!

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
            <configuration>
                <archive>
                <manifest>
                    <mainClass>
                        com.myapp.maven.App
                    </mainClass>
                </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
        </execution>
    </executions>
</plugin>

我确认依赖项甚至没有内置。

谢谢!

3 个答案:

答案 0 :(得分:0)

在这种情况下,Maven效果很好。 但是,您似乎错过了依赖点。

在定义依赖项时,maven在编译期间会使用它(因此intelliJ和执行mvn install时都不会出错)

但这并不意味着将依赖项直接放入jar中。

有许多更复杂的应用程序打包类型,例如Spring Boot应用程序,Web Archives(WAR)等,它们确实可以像这样工作(依赖的jar包含在工件中)。但是,由于您编译的是常规JAR,因此它将仅包含模块的类,在这种情况下将不包含commons-csv类。

因此,为了能够运行此应用程序,您应该选择以下选项之一:

  • 将jars of commons-csv(以及您可能具有的其他依赖项)放入类路径:java -classpath <path-to-commons-csv> -jar YourApp

  • 使用Maven Shade Plugin创建一个jar,它将确实包含所有依赖项作为类

答案 1 :(得分:0)

如其他答案所述,您需要将依赖项打包到可执行jar中(又称为Uber-JAR)。您提到您尝试了两种方法:将Maven程序集与带有描述符的jar关联依赖项和Maven阴影插件一起使用。

第一个全局说明:Maven插件配置可以在<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns9="http://sap.com" version="2.0"> <xsl:output exclude-result-prefixes="ns9" indent="yes"/> <xsl:template match="/"> <xsl:copy-of copy-namespaces="no" select="//*[parent::ns9:Message1]"/> </xsl:template> </xsl:stylesheet> 块中定义,也可以直接在POM的<pluginManagement>部分中定义。我建议将它们放在<build>中,假设您已经将它们放在其中,但由于您仅将其一部分粘贴到了问题中,因此我无法验证。

在Maven程序集插件中使用<build>描述符时,将在jar-with-dependencies文件夹中创建两个jar文件:stride-1.0-SNAPSHOT.jar和stride-1.0-SNAPSHOT-with-dependencies 。罐。您应该使用target/,所以运行-with-dependencies.jar

Shade插件比Maven程序集插件提供更多选项。但是,在您粘贴的代码中,您尚未将Maven Shade插件的执行绑定到Maven生命周期的打包阶段。如果运行java -cp target/stride-1.0-SNAPSHOT-with-dependencies.jar com.myapp.maven.App,您将不会在Maven所做的构建步骤中看到Maven阴影插件。如果您更仔细地观察mkyongs guide,您会发现需要在mvn package块中包含<phase>package</phase>

答案 2 :(得分:-1)

嗨,问题是创建jar时,没有将下载的依赖项附加到可执行jar上,这就是为什么出现错误的原因,我们可以在build标记中添加以下部分以将依赖项附加到可执行jar,然后您可以使用java -jar命令执行jar

Maven组装插件 单包 ... wow.dxdatagenerator.App 依赖罐 ->