当前位置:首页 > 后端开发 > 正文

Java项目如何打jar包?

使用Maven执行 mvn package或Gradle运行 jar任务自动打包;在IDEA/Eclipse中通过导出功能生成可执行JAR;手动使用 jar cvfe命令指定主类并包含编译后的class文件。

核心打包方法

使用JDK自带命令(适合简单项目)

# 编译所有.java文件
javac -d ./out src/*.java
# 打包编译后的class文件
jar cvf myapp.jar -C out/ .
# 指定主类(可执行JAR)
jar cvfe myapp.jar com.example.MainClass -C out/ .

说明

  • -d:指定编译输出目录
  • cvf:创建(c)、显示详情(v)、指定文件名(f)
  • e:指定入口主类(MANIFEST.MF中自动添加Main-Class

使用Maven(标准项目管理)

步骤

  1. pom.xml中添加打包配置:
    <build>
     <plugins>
         <!-- 基础打包插件 -->
         <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-jar-plugin</artifactId>
             <version>3.3.0</version>
             <configuration>
                 <archive>
                     <manifest>
                         <mainClass>com.example.Main</mainClass> <!-- 指定主类 -->
                     </manifest>
                 </archive>
             </configuration>
         </plugin>
     </plugins>
    </build>
  2. 执行打包命令:
    mvn clean package  # 输出在target目录

生成Fat Jar(包含依赖)

Java项目如何打jar包?  第1张

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.6.0</version>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <archive>
            <manifest>
                <mainClass>com.example.Main</mainClass>
            </manifest>
        </archive>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

使用Gradle(灵活构建)

基础配置build.gradle):

plugins {
    id 'java'
}
jar {
    manifest {
        attributes 'Main-Class': 'com.example.Main'
    }
}

执行打包:

gradle jar  # 输出在build/libs

生成Fat Jar

plugins {
    id 'com.github.johnrengelman.shadow' version '8.1.1'  // 添加Shadow插件
}
apply plugin: 'com.github.johnrengelman.shadow'
shadowJar {
    archiveBaseName = 'myapp'
    archiveClassifier = 'all'
    mergeServiceFiles()
}

运行:

gradle shadowJar

关键注意事项

  1. MANIFEST.MF文件
    • 必须包含Main-Class头声明可执行JAR
    • 格式要求:Main-Class: com.example.Main(末尾换行符!)
  2. 依赖处理
    • Fat Jar:适用于简单应用(Maven Assembly/Gradle Shadow)
    • 避免依赖冲突:使用maven-shade-pluginrelocate重命名包
  3. 模块化项目(Java 9+)
    • 添加module-info.java
    • 使用jlinkjpackage生成自定义运行时

验证JAR是否可用

# 检查文件结构
jar tf myapp.jar
# 运行可执行JAR
java -jar myapp.jar
# 排查类加载问题
java -verbose:class -jar myapp.jar | grep "Loaded"

常见问题解决

  • “no main manifest attribute”
    缺失Main-Class声明,检查MANIFEST.MF或构建配置。
  • ClassNotFoundException
    依赖未正确打包(Fat Jar配置错误)。
  • 版本冲突
    使用mvn dependency:tree分析依赖树。
  • 签名问题
    删除签名文件:zip -d myapp.jar 'META-INF/*.SF' 'META-INF/*.RSA'

最佳实践建议

  1. 分离依赖:生产环境推荐将依赖库放入/lib目录,通过Class-Path引用:
    Class-Path: lib/dependency1.jar lib/dependency2.jar
  2. 版本管理:JAR文件名包含版本号(如myapp-1.0.0.jar)。
  3. 安全扫描:使用OWASP Dependency-Check扫描依赖破绽。
  4. 持续集成:在Jenkins/GitHub Actions中自动化打包流程。

引用说明参考Oracle官方文档JAR文件规范、Maven官方指南及Gradle用户手册,并基于Java 17 LTS版本验证,构建工具版本号截至2025年10月有效,建议定期检查更新。

0