在Linux环境下运行Java工程是后端开发中的常见需求,整个过程涉及环境配置、项目编译、依赖管理、程序运行及后台服务管理等多个环节,以下是详细的操作步骤和注意事项,帮助顺利完成Java工程的部署与运行。
环境准备:安装与配置JDK
Java工程的运行依赖于Java Development Kit(JDK),需先确保Linux系统已安装正确版本的JDK,以下是几种常见的安装方式:
使用包管理器安装(推荐新手)
以Ubuntu/Debian系统为例,使用apt
命令安装OpenJDK(以JDK 11为例):
sudo apt update sudo apt install openjdk-11-jdk
安装后验证是否成功:
java -version # 查看Java版本 javac -version # 查看编译器版本
手动安装JDK(适用于特定版本)
若需安装Oracle JDK或其他未收录在包管理器中的版本,可手动下载安装:
(1)从Oracle官网或Adoptium下载JDK的tar.gz包(如OpenJDK 11的jdk-11.0.13_linux-x64_bin.tar.gz
);
(2)将安装包上传至Linux系统(可通过scp
或wget
下载),解压到指定目录(如/usr/local/
):
sudo tar -zxvf jdk-11.0.13_linux-x64_bin.tar.gz -C /usr/local/
(3)配置环境变量,编辑/etc/profile
或用户家目录下的~/.bashrc
文件,添加以下内容:
export JAVA_HOME=/usr/local/jdk-11.0.13 export PATH=$JAVA_HOME/bin:$PATH
(4)使配置生效:
source /etc/profile # 或 source ~/.bashrc
JDK安装方式对比
安装方式 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
包管理器安装 | 简单快速,自动依赖管理 | 版本可能较旧 | 开发测试环境,无特殊版本需求 |
手动安装 | 可灵活选择版本,适合生产环境 | 需手动配置环境变量,依赖需自行处理 | 需要特定JDK版本的生产环境 |
项目编译与依赖管理
Java工程通常使用构建工具(如Maven或Gradle)管理依赖和编译代码,需先安装对应工具并执行构建。
使用Maven构建
(1)安装Maven(以Ubuntu为例):
sudo apt install maven
(2)进入项目根目录(包含pom.xml
文件),执行编译命令:
mvn clean compile # 编译源代码,生成target目录 mvn package # 打包为jar包(默认生成jar文件于target/目录下)
若项目包含依赖,Maven会自动下载并管理,无需手动处理jar包路径。
使用Gradle构建
(1)安装Gradle(需先安装JDK,下载二进制包并配置环境变量):
# 下载Gradle(如gradle-7.2-bin.zip),解压到/usr/local/ sudo unzip gradle-7.2-bin.zip -d /usr/local/ # 配置环境变量(~/.bashrc) export GRADLE_HOME=/usr/local/gradle-7.2 export PATH=$GRADLE_HOME/bin:$PATH source ~/.bashrc
(2)进入项目根目录(包含build.gradle
文件),执行构建:
gradle build # 编译并打包,生成jar包于build/libs/目录下
普通Java项目(无构建工具)
若项目未使用Maven/Gradle,需手动编译并处理依赖:
(1)编译源代码(假设源码在src/
目录,输出到classes/
):
mkdir -p classes javac -d classes src/*.java
(2)运行时需手动指定依赖jar包路径(通过-cp
参数):
java -cp "classes:lib/*.jar" com.example.MainClass # Linux下用冒号分隔路径
运行Java程序
编译完成后,可通过java
命令运行程序,根据项目类型选择不同的运行方式。
运行普通jar包
若项目已打包为可执行jar包(包含Main-Class清单),直接运行:
java -jar target/your-app.jar
若jar包未包含依赖(如Maven的jar
打包类型),需通过-cp
指定依赖路径:
java -cp "target/your-app.jar:lib/*" com.example.MainClass
运行Spring Boot等fat jar
Spring Boot项目通常打包为“fat jar”(包含所有依赖),可直接运行:
java -jar target/spring-boot-app.jar --server.port=8081 # 可附带启动参数
后台运行与日志管理
直接运行java -jar
命令时,终端关闭会导致程序终止,需使用后台运行工具:
- nohup:让程序忽略挂断信号,输出日志到文件
nohup java -jar your-app.jar > app.log 2>&1 & # 后台运行,日志输出到app.log
- screen:创建会话,可断开连接后重新 attach
screen -S java_app # 创建新会话 java -jar your-app.jar # 在会话中运行程序 # 按Ctrl+A+D暂时断开会话,后续通过screen -r java_app恢复
后台服务管理(systemd)
生产环境中,通常将Java程序注册为systemd服务,实现开机自启、日志管理、进程监控等功能。
创建服务文件
编辑/etc/systemd/system/java-app.service
如下:
[Unit] Description=Java Application Service After=network.target [Service] User=javauser # 运行服务的用户(需提前创建) WorkingDirectory=/path/to/your/app ExecStart=/usr/bin/java -jar your-app.jar --spring.profiles.active=prod ExecStop=/bin/kill -15 $MAINPID SuccessExitStatus=143 Restart=on-failure RestartSec=10 [Install] WantedBy=multi-user.target
启动并管理服务
systemctl daemon-reload # 重新加载服务配置 systemctl start java-app # 启动服务 systemctl enable java-app # 开机自启 systemctl status java-app # 查看服务状态 journalctl -u java-app -f # 查看实时日志
常见问题排查
java: command not found
:检查JDK是否安装成功,JAVA_HOME
和PATH
是否正确配置。Error: Could not find or load main class
:- 检查
-cp
路径是否正确(Linux下用冒号分隔); - 确认包名与类名是否匹配(如
com.example.MainClass
); - 若为jar包,检查
META-INF/MANIFEST.MF
中的Main-Class
是否配置正确。
- 检查
- 内存溢出(
OutOfMemoryError
):调整JVM参数,如java -Xms512m -Xmx2048m -jar your-app.jar
(初始堆512m,最大堆2g)。
相关问答FAQs
Q1: 如何让Java程序在Linux开机时自动启动?
A1: 可通过两种方式实现:
(1)使用nohup
结合&
后台运行,并添加到/etc/rc.local
文件(需赋予执行权限chmod +x /etc/rc.local
);
(2)推荐使用systemd服务(如上文所述),通过systemctl enable
设置开机自启,更适合生产环境,支持依赖管理和进程监控。
Q2: 运行jar包时提示“no main manifest attribute”,如何解决?
A2: 该错误通常表示jar包未正确配置Main-Class
入口点,解决方法:
(1)若使用Maven,检查pom.xml
中是否添加maven-jar-plugin
并配置Main-Class
:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.0</version> <configuration> <archive> <manifest> <mainClass>com.example.MainClass</mainClass> </manifest> </archive> </configuration> </plugin>
(2)若为手动打包,可通过jar cvfe your.jar com.example.MainClass *.class
命令创建包含主类的jar包;
(3)若依赖未包含,可使用java -cp "your.jar:lib/*" com.example.MainClass
直接指定主类运行。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/20987.html