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

标签 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 package,然后重新运行我的构建命令。运气不好。

我也尝试过 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>

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

谢谢!

最佳答案

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

当您定义依赖项时,maven 在编译期间使用它(因此 intelliJ 中和执行 mvn install 时都没有错误)

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

还有更复杂的应用程序打包类型,它确实像这样工作(依赖的 jar 包含在 Artifact 中),例如 Spring boot 应用程序、Web Archives (WAR) 等。但由于您编译的是常规 JAR,因此它将仅包含模块的类,在本例中不会包含 commons-csv 的类。

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

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

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

关于java - Maven 异常 NoClassDefFoundError ClassNotFoundException 但 Maven 依赖项存在命令行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56319669/

相关文章:

Java StringToNUMBER - 如果字符串包含数字以外的任何内容,则返回 0;如果是负数,则返回初始 "-"

java - 将Maven项目发布到Github包

android - 打包/Maven 化公共(public)软件组件

Maven - 是否可以同时构建一个指定多个配置文件的项目?

java - Box2D 未检测到碰撞

java - 关于我的数组代码

java - Android应用程序中的倒计时

java - Netbeans 警告 pom.xml 中 "http://download.java.net/maven/2"的黑名单存储库声明。如何解决?

java - 将图像图标添加到按钮/标签 Swing

java - 如何捕获 Room 持久性库中未处理的异常