maven项目多个main函数打包并运行jar包方式

本文详细介绍了如何使用Maven的Shade插件进行项目打包,包括配置pom.xml文件,排除特定文件,指定主类以及执行打包命令。通过示例展示了如何生成包含默认主程序入口的单一jar包,并提供了运行该jar包的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pom.xml

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.3</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                        <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>dbOperate.DBMain</mainClass> //默认的主程序入口
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

打包命令 mvn package (加clean貌似会报错)

生成一个jar: test-1.0-SNAPSHOT.jar

运行方式:java -jar test-1.0-SNAPSHOT.jar 是执行默认的主程序,即dbOperate.DBMain

在项目中我还有一个main函数,matchDatasClean.MatchDataClean,若要执行它,

可以: java -cp test-1.0-SNAPSHOT.jar matchDatasClean.MatchDataClean

<think>好的,我现在需要解决用户的问题:他的Maven项目中每个类都有一个main函数入口,想要知道如何打包JAR文件。首先,我需要理解用户的具体需求。每个类都有main方法可能意味着用户可能有多个可执行的入口点,比如不同的工具类或者示例程序。这时候,用户可能需要打包成一个JAR且能够选择不同的主类来运行。 首先,回顾之前给用户的回答,我之前介绍了两种打包方式:使用IDEA自带功能和Maven。用户现在的情况是使用Maven项目,但每个类都有main方法,可能之前的配置只能指定一个主类,无法满足需求。用户的问题可能在于如何配置Maven使得可以生成多个可执行JAR,每个对应不同的主类,或者生成一个JAR但允许动态指定主类。 接下来,我需要考虑可能的解决方案。通常,Maven默认的maven-jar-plugin只能配置一个主类,所以当有多个main方法时,用户可能需要不同的处理方式。可能的解决方案有三种: 1. **独立打包每个主类**:为每个含有main方法的类生成单独的JAR文件,每个JAR指定不同的主类。这需要配置多个execution,每个指定不同的主类,使用classifier来区分生成的JAR。这样用户可以通过不同的JAR文件来启动不同的程序。 2. **动态指定主类**:生成一个含所有依赖的JAR,但允许在运行时通过命令行参数指定要运行的主类。这样用户可以使用同一个JAR,但运行不同的主类,例如`java -cp app.jar com.example.ClassA`。这需要使用maven-assembly-plugin或maven-shade-plugin来打包在MANIFEST.MF中不指定Main-Class,或者留空,让用户在运行时指定。 3. **统一入口分发**:创建一个统一的主类,通过参数调用不同的功能,这样只需要一个主类,其他类作为功能模块。这种方式需要修改代码结构,可能不是用户想要的,但可以作为建议之一。 接下来,我需要详细说明每个方案的实现步骤,特别是前两种,因为用户可能不想修改现有代码结构。对于独立打包每个主类,需要配置maven-jar-plugin多次,每次指定不同的主类和classifier,这样在package阶段会生成多个JAR。对于动态指定主类,需要确保MANIFEST.MF不指定Main-Class,或者允许覆盖,这样用户可以在运行时通过命令行指定。 同时,需要注意用户可能遇到的常见问题,例如依赖冲突、MANIFEST.MF配置错误等。此外,用户可能不清楚如何配置多个execution,或者如何正确使用classifier,需要给出示例pom.xml配置。 最后,需要比较不同方案的优缺点,帮助用户选择最适合的方法。例如,独立打包适合需要分开发布不同入口的情况,而动态指定适合内部工具或测试多个主类的情况。同时提醒用户,过多的main方法可能不符合标准项目结构,建议合理规划入口点。</think>针对您的特殊需求(多个含`main()`方法),这里提供三种专业解决方案: ### 方案一:独立打包每个主类(精准分发) **适用场景**:需要为不同入口类生成独立可执行JAR ```xml <build> <plugins> <!-- 主程序打包 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <executions> <!-- 入口类1 --> <execution> <id>class-a</id> <configuration> <classifier>classA</classifier> <archive> <manifest> <mainClass>com.example.ClassA</mainClass> </manifest> </archive> </configuration> </execution> <!-- 入口类2 --> <execution> <id>class-b</id> <configuration> <classifier>classB</classifier> <archive> <manifest> <mainClass>com.example.ClassB</mainClass> </manifest> </archive> </configuration> </execution> </executions> </plugin> <!-- 处理依赖 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build> ``` **生成结果**: - `target/your-app-classA.jar` - `target/your-app-classB.jar` ### 方案二:动态入口点(灵活调用) **适用场景**:通过命令行参数指定运行类 ```bash # 运行任意类(需含依赖) java -cp your-app-with-dependencies.jar com.example.ClassC ``` **配置要点**: 1. 在`pom.xml`中仅打包依赖,不指定主类: ```xml <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <configuration> <archive> <manifest> <!-- 不设置mainClass --> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </plugin> ``` ### 方案三:统一入口分发(推荐架构) **适用场景**:通过参数选择功能模块 ```java // UnifiedMain.java public class UnifiedMain { public static void main(String[] args) { if(args.length == 0) { System.out.println("可用模块:\n1. ClassA\n2. ClassB"); return; } switch(args[0]) { case "ClassA": ClassA.main(Arrays.copyOfRange(args, 1, args.length)); break; case "ClassB": ClassB.main(Arrays.copyOfRange(args, 1, args.length)); break; default: System.err.println("无效模块"); } } } ``` ### 技术选型建议 | 方案 | 优点 | 缺点 | 适用场景 | |------|------|------|----------| | 独立打包 | 隔离性好 | 体积大 | 正式环境分发 | | 动态入口 | 灵活性强 | 命令行复杂 | 开发测试环境 | | 统一入口 | 架构规范 | 需要改造代码 | 长期维护项目 | ### 高级技巧:清单文件增强 通过自定义`MANIFEST.MF`支持多入口提示: ```xml <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>com.example.UnifiedMain</mainClass> <addDefaultImplementationEntries>true</addDefaultImplementationEntries> <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries> </manifest> ``` 建议优先考虑方案三进行架构优化,若需保留现有结构可选择方案二。实际开发中推荐使用Spring Boot的`@Configuration`方式管理多入口,可大幅提升工程化水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值