我正在尝试在另一个正在进行的项目中实现自己的jar(库)。但是,当我运行程序并尝试从我构建的库中实例化一个类时,出现错误NoClassDefFoundError

我尝试通过maven本地存储库以不同方式添加依赖项,或者将jar文件直接添加为“构建路径”中的外部jar。我在Eclipse中未收到任何警告/错误,并且可以使用maven成功构建和安装该应用程序。但是,当我执行使用该库中的类的代码部分时,会得到NoClassDefFoundError。

我的库groupId是com.mycompany.myapp,而我正在使用的类在com.mycompany.myapp.business包中。我试图将类移到父包,以防万一,但是我总是遇到相同的错误。

1-导入jar时是否需要定义哪些类需要可用?

2-除了mvn氏族软件包/安装以外,是否需要以特定方式编译库?

3-我需要在父项目的库中添加与库中相同的依赖项,以使一切正常吗?

这是我的孩子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.mylibrary</groupId>
  <artifactId>mylibrary</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.7.0</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
      <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.1</version>
        </plugin>
    </plugins>
  </build>
  <dependencies>
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.1.1</version>
    </dependency>
    <dependency>
        <groupId>commons-discovery</groupId>
        <artifactId>commons-discovery</artifactId>
        <version>0.5</version>
    </dependency>
    <dependency>
        <groupId>wsdl4j</groupId>
        <artifactId>wsdl4j</artifactId>
        <version>1.6.3</version>
    </dependency>
    <dependency>
        <groupId>jaxen</groupId>
        <artifactId>jaxen</artifactId>
        <version>1.1.6</version>
    </dependency>
    <dependency>
        <groupId>javax.xml.rpc</groupId>
        <artifactId>javax.xml.rpc-api</artifactId>
        <version>1.1.1</version>
    </dependency>
    <dependency>
        <groupId>dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>1.6.1</version>
    </dependency>
    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcprov-jdk15on</artifactId>
        <version>1.47</version>
    </dependency>
    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcpkix-jdk15on</artifactId>
        <version>1.47</version>
    </dependency>
    <dependency>
        <groupId>org.apache.axis</groupId>
        <artifactId>axis</artifactId>
        <version>1.4</version>
    </dependency>
    <dependency>
        <groupId>javax.xml.rpc</groupId>
        <artifactId>javax.xml.rpc-api</artifactId>
        <version>1.1.1</version>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.5.0-M1</version>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>1.4</version>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.5.0-M1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-launcher</artifactId>
        <version>1.5.0-M1</version>
    </dependency>
    <dependency>
            <groupId>org.junit</groupId>
            <artifactId>junit-bom</artifactId>
            <version>5.3.1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
  </dependencies>
</project>


然后在我的主项目中,我通过以下方式实例化该类:

Init oInit = new Init();


其中Init是在com.mycompany.mylibrary.business包中定义的公共类。

java.lang.NoClassDefFoundError: com/mycompany/mylibrary/business/Init


主要项目的pom.xml:

<dependency>
      <groupId>com.mycompany.mylibrary</groupId>
      <artifactId>mylibrary</artifactId>
      <version>0.0.1-SNAPSHOT</version>
 </dependency>


在父项目中,在由maven导入的库中,我看到我的库具有一个文件夹图标,而不是另一个。
java - 实现自己的jar时获取NoClassDefFoundError-LMLPHP

最佳答案

您可以使用两种方式将库包含到您的项目中:


将库直接包含到您的项目类路径中
通过Maven


使用Maven选项时,必须确保将库很好地导出到本地或远程的Maven存储库(例如Nexus)。当查找pom.xml中定义的库时,Maven会搜索的第一个位置是本地存储库(位于~/.m2上)。它将查找Central Maven存储库(位于https://mvnrepository.com/repos/central)。在这两者之间,您可以将自己的存储库声明为pom.xml,如下所示:

<repositories>
    <repository>
        <id>my-repo</id>
        <name>My Maven Repository</name>
        <url>${nexus.repositories.url}</url>
    </repository>
<repositories>


如何构建要包含在您自己的本地或远程存储库中的库?只需确保在使用Maven进行编译时包括安装目标,并将存储库定义包含在其pom.xml中

10-07 18:54
查看更多