maven工程 将main函数打成jar包

本文介绍了在Maven项目中遇到的打包失败问题及其解决过程。主要问题是由于未指定主函数导致的数据库连接异常错误。通过正确配置spring-boot-maven-plugin插件中的主类路径,最终实现了项目的成功打包。

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

前一阵子,在公司的一个maven项目里添加了一个推送模块。
最近在优化代码,打算把工程中的一些附加模块再单独建一个工程(也是个maven工程),打成jar包再在主工程中依赖进去。

将maven工程打成jar包的时候出错了:“The Network Adapter could not establish the connection”,这里报了数据库连接不上。后来发现程序是直接执行,没有进行打包操作,主要是build标签中没有加主函数。

然后在build标签中加入了主函数
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.***.MsgPushApplication</mainClass>
</configuration>
</plugin>
</plugins>
</build>

test也删除了一下。之后打包成功了。

<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、付费专栏及课程。

余额充值