实现自己的jar时获取NoClassDefFoundError

时间:2019-06-07 15:38:32

标签: java maven

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

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

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

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

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

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导入的库中,我看到我的库有一个文件夹图标,而不是另一个。 enter image description here

1 个答案:

答案 0 :(得分:0)

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

  • 将库直接包含在您的项目类路径中
  • 通过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