如何用Maven从同一Java单体项目生成CLIENT与SERVER两个JAR包?
迁移非Maven Java项目到Maven并生成双JAR包方案
一、用Maven插件实现(无需拆分项目)
完全可以通过Maven插件实现单项目生成两个JAR包,推荐使用maven-assembly-plugin或maven-shade-plugin,具体实现思路如下:
- 配置插件多执行实例
在项目根pom.xml中添加插件配置,为CLIENT和SERVER分别定义独立的打包逻辑:
- 针对每个模块指定专属主类、需要包含的源码/资源目录、依赖集合
- 可通过自定义assembly描述文件(XML)精细控制打包范围,区分CLIENT和SERVER的代码路径
示例配置片段(以maven-assembly-plugin为例):
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <executions> <!-- CLIENT打包配置 --> <execution> <id>package-client</id> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <descriptor>src/main/assembly/client-assembly.xml</descriptor> <finalName>client-${project.version}</finalName> </configuration> </execution> <!-- SERVER打包配置 --> <execution> <id>package-server</id> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <descriptor>src/main/assembly/server-assembly.xml</descriptor> <finalName>server-${project.version}</finalName> </configuration> </execution> </executions> </plugin> </plugins> </build>
- 编写assembly描述文件
在src/main/assembly下创建client-assembly.xml和server-assembly.xml,分别定义各自的打包范围:
比如client-assembly.xml中指定只包含CLIENT相关代码和资源:
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd"> <id>client</id> <formats> <format>jar</format> </formats> <includeBaseDirectory>false</includeBaseDirectory> <fileSets> <fileSet> <directory>${project.build.outputDirectory}</directory> <includes> <include>com/yourproject/client/**/*</include> <include>com/yourproject/common/**/*</include> <!-- 若有公共代码 --> </includes> </fileSet> <fileSet> <directory>src/main/resources</directory> <includes> <include>client/**/*</include> </includes> </fileSet> </fileSets> <dependencySets> <dependencySet> <outputDirectory>/</outputDirectory> <useProjectArtifact>false</useProjectArtifact> <unpack>true</unpack> <scope>runtime</scope> </dependencySet> </dependencySets> <archive> <manifest> <mainClass>com.yourproject.client.Main</mainClass> <!-- CLIENT主类 --> </manifest> </archive> </assembly>
- 在NetBeans中执行打包
- 打开项目的Maven面板,找到
assembly插件下的package-client和package-server目标,分别执行即可生成对应JAR - 或直接执行
mvn clean package命令,插件会在打包阶段自动生成两个JAR包
二、拆分多模块Maven项目(更规范的长期方案)
如果插件配置繁琐,或项目后续有独立维护CLIENT/SERVER的需求,拆分多模块是更合理的选择:
- 创建父项目结构
根目录创建pom.xml,设置packaging为pom并声明子模块:
<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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.yourproject</groupId> <artifactId>parent-project</artifactId> <version>1.0.0</version> <packaging>pom</packaging> <modules> <module>client</module> <module>server</module> <!-- 若有公共代码,可添加common模块 --> <module>common</module> </modules> </project>
- 创建子模块
- 在根目录下创建
client和server子目录,每个子目录单独创建pom.xml,配置打包为jar并指定各自的主类和依赖 - 将原项目中CLIENT相关的代码、Swing表单文件、资源复制到
client/src/main/java和client/src/main/resources目录;同理处理SERVER模块
- NetBeans中管理多模块
- 直接导入父项目,NetBeans会自动识别所有子模块
- 执行父项目的
clean package目标,会同时生成两个子模块的JAR包;也可单独对某个子模块执行打包操作
注意事项
- 若存在CLIENT和SERVER共用的代码,建议提取为独立的
common子模块,让CLIENT和SERVER依赖该模块,避免代码冗余 - Swing表单相关的文件(如NetBeans生成的
.form文件)需确保在Maven资源目录配置中被正确包含,避免打包时丢失
内容的提问来源于stack exchange,提问作者matteo baudino
相关产品推荐
相关产品推荐

