为遗留Java项目配置Maven/IntelliJ后无法重建目标大体积Jar文件
解决Maven构建大体积可执行Jar及POM错误问题
核心问题分析
- 小Jar与大Jar的差异:你当前
target目录下生成的18kb Jar是仅包含项目自身编译代码的瘦Jar,而服务器上的5049kb旧Jar是包含所有依赖库的可执行胖Jar。Maven默认的package目标只会生成瘦Jar,不会自动构建包含依赖的胖Jar。 - POM错误根源:你错误地将项目的
groupId、artifactId、version、packaging这些顶级配置放到了<plugin>标签内部,Maven无法识别该位置的配置项,导致解析失败。
修复步骤
1. 修正POM文件配置
以下是修正后的完整POM,包含生成胖Jar的配置,同时会将根目录的DbCred.ini打包到Jar中:
<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> <!-- 项目核心配置,必须放在project根节点下 --> <groupId>Task</groupId> <artifactId>ServiceNowTask</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>ServiceNowTask</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>18</java.version> <maven.compiler.source>18</maven.compiler.source> <maven.compiler.target>18</maven.compiler.target> </properties> <!-- 资源文件配置:将根目录的DbCred.ini打包到Jar中 --> <build> <resources> <resource> <directory>${project.basedir}/../../../../</directory> <includes> <include>DbCred.ini</include> </includes> </resource> </resources> <plugins> <!-- 生成包含所有依赖的可执行胖Jar --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <configuration> <!-- 指定主类,替换成你项目的主类全路径,例如Task.ServiceNowTask.Main --> <archive> <manifest> <mainClass>你的主类全路径</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <!-- 生成的Jar名称与旧Jar保持一致 --> <finalName>ServiceNowTask</finalName> <appendAssemblyId>false</appendAssemblyId> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.3</version> </dependency> <dependency> <groupId>com.googlecode.json-simple</groupId> <artifactId>json-simple</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>org.ini4j</groupId> <artifactId>ini4j</artifactId> <version>0.5.4</version> </dependency> </dependencies> </project>
注意:必须将<mainClass>标签内的内容替换为你项目实际的主类全限定名(如Task.ServiceNowTask.YourMainClass),否则生成的Jar无法直接执行。
2. 执行Maven构建
在IntelliJ中操作:
- 打开右侧Maven面板,找到你的项目,展开
Lifecycle,依次执行clean→package - 或在pom.xml所在目录打开终端,执行命令:
mvn clean package
3. 获取生成的胖Jar
构建完成后,你会在target目录下找到ServiceNowTask.jar(与旧Jar同名,体积接近5MB),将此Jar替换服务器上的旧Jar即可生效。
额外说明
- 若需单独构建其他同层级的ServiceNow项目,只需为每个项目配置类似的POM文件,确保主类和资源路径正确即可。
clean目标会清理之前的构建产物,避免旧文件干扰新产物。
内容的提问来源于stack exchange,提问作者Michele
相关产品推荐
相关产品推荐

