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>