温馨提示×

Java项目Ubuntu编译最佳实践

小樊
47
2025-11-18 22:00:23
栏目: 编程语言

Ubuntu下Java项目编译最佳实践

一 环境准备与版本管理

  • 安装并验证 JDK:优先选择 LTS 版本(如 OpenJDK 11 或 17),使用包管理器安装,安装后用 java -version 与 javac -version 校验版本一致性。
  • 多版本共存与切换:使用 update-alternatives 管理多个 JDK,便于在不同项目间快速切换;设置 JAVA_HOME 指向所选 JDK,并将 $JAVA_HOME/bin 加入 PATH,保证命令行与构建工具使用统一 JDK。
  • 基础工具:按需安装 Git(源码管理)、构建工具(Maven/Gradle)等常用开发工具,减少后续环境不一致问题。

二 构建工具选择与标准命令

  • 原生编译(适合简单项目或学习场景):使用 javac 指定源码目录与目标目录,依赖通过 -cp 传入;包结构需与目录一致,运行时使用完整类名(含包名)。
  • Maven 项目(约定优于配置):在项目根目录执行 mvn compile 编译、mvn package 打包;常用生命周期还包括 clean(清理)、test(运行单元测试)。打包产物默认在 target/ 目录。
  • Gradle 项目(灵活与可扩展):在项目根目录执行 gradle build 完成编译、测试与打包;常用任务包括 classesjartestClasses 等,产物默认在 build/libs/ 目录。

三 打包与可执行 JAR 配置

  • 可执行 Fat JAR(推荐):将所有依赖打进一个可执行 JAR,便于分发与运行。
    • Maven 示例(使用 maven-assembly-plugin 或 maven-shade-plugin,二选一或按需组合):
      • 使用 maven-assembly-plugin
        <build>
          <plugins>
            <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.App</mainClass>
                  </manifest>
                </archive>
              </configuration>
              <executions>
                <execution>
                  <id>make-assembly</id>
                  <phase>package</phase>
                  <goals>
                    <goal>single</goal>
                  </goals>
                </execution>
              </executions>
            </plugin>
          </plugins>
        </build>
        
      • 使用 maven-shade-plugin(更灵活处理冲突与资源)
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-shade-plugin</artifactId>
          <version>3.5.0</version>
          <executions>
            <execution>
              <phase>package</phase>
              <goals><goal>shade</goal></goals>
              <configuration>
                <transformers>
                  <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                    <mainClass>com.example.App</mainClass>
                  </transformer>
                </transformers>
              </configuration>
            </execution>
          </executions>
        </plugin>
        
    • Gradle 示例(使用 application 插件或手动配置 jar 任务):
      • application 插件(同时提供 run 任务)
        plugins {
          id 'application'
        }
        application {
          mainClass = 'com.example.App'
        }
        
      • 手动配置 jar 任务
        jar {
          manifest {
            attributes 'Main-Class': 'com.example.App'
          }
          from {
            configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
          }
        }
        
  • 运行与产物路径:构建完成后,使用 java -jar your-app.jar 运行;Maven 产物在 target/,Gradle 产物在 build/libs/

四 本地与服务器部署及运行

  • 传输与运行:使用 scp 将可执行 JAR 上传至目标服务器,执行 java -jar app.jar 启动;生产环境建议配合 进程守护日志轮转
  • systemd 服务示例(创建文件:/etc/systemd/system/myapp.service):
    [Unit]
    Description=My Java Application
    After=network.target
    
    [Service]
    Type=simple
    User=appuser
    ExecStart=/usr/bin/java -jar /opt/myapp/app.jar
    SuccessExitStatus=143
    Restart=on-failure
    RestartSec=10
    
    [Install]
    WantedBy=multi-user.target
    
    常用命令:sudo systemctl daemon-reloadsudo systemctl enable myapp.servicesudo systemctl start myapp.servicesudo systemctl status myapp.service

五 质量保障与常见问题处理

  • 质量保障:在 CI/构建流程中强制执行 mvn testgradle test,确保测试通过后再打包与部署;必要时集成覆盖率与静态检查工具,提升交付质量。
  • 常见问题速查
    • 类路径问题:依赖未正确加入 -cp 或构建产物缺少依赖,检查构建配置与运行命令的类路径参数。
    • 包与目录不一致:存在 package 声明时,源码目录结构必须与包名一致;运行时使用完整类名(如 com.example.App)。
    • 环境变量问题:确认 JAVA_HOMEPATH 指向期望的 JDK,避免构建工具与命令行使用不同版本导致行为差异。

0