我正在尝试在另一个我正在从事的项目中实现自己的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>
答案 0 :(得分:0)
您可以使用两种方式将库包含到您的项目中:
使用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