Java项目多个模块只有一个主函数打包时
在Java项目中,通常会将代码按照功能模块进行拆分,每个模块都有自己的功能和职责。然而,在某些情况下,我们可能希望将多个模块合并为一个可执行的Jar文件,以便于部署和运行。本文将介绍如何实现Java项目多个模块只有一个主函数打包的方法,并提供代码示例进行说明。
情景描述
假设我们有一个Java项目,其中包含两个模块:模块A和模块B。模块A负责处理用户输入,模块B负责进行一些计算操作。我们希望将这两个模块合并为一个可执行的Jar文件,并在其中只保留一个主函数用于启动整个应用。
方法一:使用Maven进行打包
我们可以使用Maven来管理和构建项目,通过配置Maven的maven-jar-plugin
插件,可以很方便地将多个模块打包成一个Jar文件。
首先,在每个模块的pom.xml文件中添加以下配置:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.example.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
其中,com.example.Main
是你想要设定为主函数的类。
然后,在模块A的pom.xml文件中添加以下配置:
<dependencies>
<!-- 模块B的依赖 -->
<dependency>
<groupId>com.example</groupId>
<artifactId>module-B</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
接着,在模块B的pom.xml文件中添加以下配置:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.example.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
最后,使用Maven的install
命令进行打包:
mvn install
打包完成后,会在每个模块的target
目录下生成相应的Jar文件,其中模块A的Jar文件中包含了模块B的依赖,并且具有一个主函数用于启动应用。
方法二:手动合并Jar文件
除了使用Maven进行打包外,我们还可以手动合并多个Jar文件。
首先,将模块A和模块B分别使用javac
命令进行编译,生成对应的class文件。
然后,创建一个新的目录,将模块A和模块B的class文件复制到该目录下。
接着,使用以下命令将模块B的class文件合并到模块A的Jar文件中:
jar uf module-A.jar -C module-B/ .
最后,可以通过以下命令执行合并后的Jar文件:
java -jar module-A.jar
这样就实现了多个模块只有一个主函数的打包。
示例代码
下面是一个简单的示例代码,演示了如何实现多个模块只有一个主函数的打包。
Module A
package com.example.moduleA;
import com.example.moduleB.ModuleB;
public class ModuleA {
public static void main(String[] args) {
ModuleB moduleB = new ModuleB();
moduleB.doSomething();
System.out.println("Module A");
}
}
Module B
package com.example.moduleB;
public class ModuleB {
public void doSomething() {
System.out.println("Module B");
}
}
pom.xml
<!-- Module A -->
<dependencies>
<!-- Module B -->
<dependency>
<groupId>com.example</groupId>
<artifactId>module-B</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>