java - 如何告诉 Maven 构建一个可执行的 jar

标签 java maven-2 package

这看起来应该很简单,但我没有弄清楚,也没有从阅读文档和搜索网络中获得太多帮助。为了学习在多模块项目中使用 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/

相关文章:

Java : Storing Data in Array Of Object from JOptionPane Dialog

maven-2 - 如何在另一个插件执行前后声明一个maven插件的执行前后?

linux - 我如何找到哪个用户在 linux 中安装了一个包?

golang 导入包内包

java - 更好地检测三角形按钮(libgdx)

java - 无法写入核心转储。默认情况下,在 Windows 客户端版本上不启用小型转储,同时从 java 调用 dll

java - 用数据库值填充数组列表

maven-2 - 使用 maven-assembly-plugin 构建一个 jar 并将其包含在一个 zip 中

maven-2 - 一些 sonatype 关系问题

c# - 制作C#项目安装包