繁体   English   中英

具有本地依赖项的 maven 项目中的 NoClassDefFoundError

[英]NoClassDefFoundError in maven project with local dependency

我正在尝试运行由 maven 创建的 .jar 文件,其中包含一个未被识别的本地依赖项(处理库)。 我使用了 maven-install-plugin。 库的 jar 位于 root/lib。 运行后

$ mvn validate
$ mvn clean package
$ java -cp target/my-app-1.0.jar com.mycompany.app.App

我收到错误:

Error: Could not find or load main class com.mycompany.app.App
Caused by: java.lang.NoClassDefFoundError: processing/core/PApplet

但是,当我运行时,该应用程序运行良好:

$ java -cp target/classes:$HOME/.m2/repository/org/processing/core/10/core-10.jar com.mycompany.app.App

这是我的 pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0</version>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>14</maven.compiler.source>
    <maven.compiler.target>14</maven.compiler.target>
  </properties>

  <dependencies>
    <!--  LOCAL  -->
    <dependency>
      <groupId>org.processing</groupId>
      <artifactId>core</artifactId>
      <version>10</version>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-install-plugin</artifactId>
        <version>2.5.1</version>
        <configuration>
          <groupId>org.processing</groupId>
          <artifactId>core</artifactId>
          <version>10</version>
          <packaging>jar</packaging>
          <file>${pom.basedir}/lib/processing-core.jar</file>
          <generatePom>true</generatePom>
        </configuration>
        <executions>
          <execution>
            <id>install-jar-lib</id>
            <goals>
              <goal>install-file</goal>
            </goals>
            <phase>validate</phase>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  
</project>

这是来源:

package com.mycompany.app;

import processing.core.PApplet;

public class App extends PApplet{
    public static void main( String[] args ) {
        PApplet.main(App.class, args);
        System.out.println( "Hello World!" );
    }
}

我的环境:

$ mvn -version
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 14.0.2, vendor: Private Build, runtime: /usr/lib/jvm/java-14-openjdk-amd64
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "5.8.0-33-generic", arch: "amd64", family: "unix"

谢谢你的所有建议。

maven-install-plugin 用于在本地 maven 存储库中安装工件。 这不是您想在这里做的。 您的目标是在类路径中获得依赖项。

为了能够使用此命令启动您的代码

java -cp target/my-app-1.0.jar com.mycompany.app.App

你必须确保两件事

  1. 应用程序 jar 的清单必须包含依赖项的路径 jar
  2. 依赖项 jar 必须位于指定位置

对于第一部分,您可以使用maven-jar-plugin

<plugin>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.2.0</version>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>lib/</classpathPrefix>
            </manifest>
        </archive>
    </configuration>
</plugin>

请注意,这会将所有依赖项添加到类路径中,这可能是也可能不是您想要的。

对于第二部分,您可以使用maven-dependency-plugin 这会将所有依赖项(或通过适当的配置仅选择依赖项)复制到 target/lib

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>3.1.2</version>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <outputDirectory>${project.build.directory}/lib</outputDirectory>
    </configuration>
</plugin>

使用此配置,目标目录应该看起来像这样,仅显示相关文件/目录:

target
|- lib
|  |- core-10.jar
|- my-app-1.0.jar

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM