Maven异常NoclassDeffoundError classNotFoundException,但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毫无麻烦。

但是,当我尝试运行罐子时:

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中,我可以在外部库中看到依赖关系。

我还尝试使用Shade将依赖项复制到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清洁安装程序包,然后是我的构建命令。没有运气。

我还尝试了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时都没有错误(

,但这并不意味着依赖项就放在罐子中。

应用程序的应用程序类型更复杂,它的确可以工作(依赖性罐子中包含在工件中(,例如春季启动应用程序,Web Archives(WAR(等。但是,由于您编译了一个普通的罐子,它将仅包含模块的类,并且在这种情况下不会包括Commons-CSV类。

因此,为了能够运行此应用程序,您应该选择一个:

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

  • 使用Maven Shade插件创建一个jar,它确实将所有依赖项都包含为class

如其他答案中所述,您需要在可执行罐中包装依赖项(又称Uber-jar(。您提到您已经尝试了两种方法:使用与Descriptorref jar-with依赖性和Maven Shade插件的Maven组件。

第一个全局备注:Maven插件配置可以在<pluginManagement>块中或直接在POM的<build>部分中定义。我建议将它们放在<build>中,我认为您已经将它们放在那里,但是我无法验证,因为您仅在问题中粘贴了一部分。

在Maven Assembly插件中使用jar-with-dependencies Descriptorref时,将在您的target/文件夹中创建两个JAR文件:stride-1.0-snapshot.jar和stride-1.0-snapshot-snapshot-with-with intendendencies.jar。您应该使用-with-dependencies.jar,因此运行java -cp target/stride-1.0-SNAPSHOT-with-dependencies.jar com.myapp.maven.App

Shade插件比Maven Assembly插件提供了更多的选项。但是,在粘贴的代码中,您没有将Maven Shade插件的执行限制为Maven生命周期的包装阶段。如果运行mvn package,您将不会将Maven Shade插件视为Maven所做的构建步骤的一部分。如果您更仔细地查看Mkyongs指南,您会发现您需要在<execution>块中包含<phase>package</phase>

嗨,问题是,当jar创建时,下载的依赖项并未附加到可执行jar上,这就是为什么出现错误的原因,我们可以将下面的部分添加到构建标签以使依赖项附加到可执行JAR上,然后您可以使用Java -jar命令

执行JAR 毛绒组装 - plugin 包装单 ...哇。dxdatagenerator.App jar依赖性 ->

最新更新