这看起来应该很简单,但我没有弄清楚,也没有从阅读文档和搜索网络中获得太多帮助。为了学习在多模块项目中使用 Maven (2.2.1),我使用 Maven 创建了一个简单的项目 P,其中包含类 C(包含主类)和子类 S。当我运行 mvn install
构建运行并生成构建成功消息。但是,当我运行生成的 C jar 时,出现异常:“线程“主”java.lang.NoClassDefFoundError 中的异常:P/S”
目录结构(不显示src等子目录)为:
P
|--C
|--S
目前P目录下的pom.xml是:
<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>P</groupId>
<artifactId>P</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<name>P</name>
<url>http://maven.apache.org</url>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>P</groupId>
<artifactId>C</artifactId>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>P</groupId>
<artifactId>S</artifactId>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>P.C</mainClass>
<packageName>P.C</packageName>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
<modules>
<module>C</module>
<module>S</module>
</modules>
</project>
C 中的 pom.xml 是:
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>P</artifactId>
<groupId>P</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>P</groupId>
<artifactId>C</artifactId>
<version>1.0-SNAPSHOT</version>
<name>C</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>P</groupId>
<artifactId>S</artifactId>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
S 中的 pom.xml 是:
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>P</artifactId>
<groupId>P</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>P</groupId>
<artifactId>S</artifactId>
<version>1.0-SNAPSHOT</version>
<name>S</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
以上均为多次尝试后的最新版本。
对于这个简单的学习练习,Java 类是:
P/C/src/main/java/P/C.java:
package P;
public class C
{
public static void main( String[] args )
{
System.out.println( "Hello World!" );
S o = new S();
o.sayHey();
}
}
和S/src/main/java/P/S.java:
package P;
public class S
{
public void sayHey()
{
System.out.println("Hey!");
}
}
那么,我如何告诉 Maven 将 S 类包含在 C jar 中?
最佳答案
默认情况下,Maven 不在工件中包含依赖项:要运行 P,您的类路径中仍然需要 S。
这通常不是问题,因为 maven 本身使用传递依赖项:例如,如果您有另一个项目依赖于 P,它会自动将 P 和 S 都放在您的类路径中。
如果您想创建一个“uber-jar”:一个包含所有依赖项的自包含 jar,请查看“shade”插件:http://maven.apache.org/plugins/maven-shade-plugin/
关于java - 如何告诉 Maven 构建一个可执行的 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5107988/