1. 项目概述
最近在帮团队搭建新的Java开发环境,选择了Ubuntu 22.04 LTS作为基础系统,搭配JDK 17和MySQL 8.0这套目前最稳定的组合。这个配置特别适合需要长期维护的企业级项目,既能享受到新版本的语言特性,又能保证数据库的稳定运行。下面就把整个搭建过程详细记录下来,包括我在实际安装中踩过的坑和优化技巧。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备
2.1 系统要求
建议使用Ubuntu 22.04 LTS或20.04 LTS版本,这两个都是长期支持版。我的测试环境配置是4核CPU/8GB内存/100GB SSD,这个配置跑中小型Java项目完全够用。如果是生产环境,建议根据项目规模适当调整:
- 小型项目:2核/4GB/50GB
- 中型项目:4核/8GB/100GB
- 大型项目:8核+/16GB+/200GB+
注意:安装前确保系统已更新到最新状态:
bash复制sudo apt update && sudo apt upgrade -y
2.2 用户权限设置
建议创建一个专门的运行用户,不要直接使用root:
bash复制sudo adduser javauser
sudo usermod -aG sudo javauser
3. JDK 17安装与配置
3.1 安装OpenJDK 17
Ubuntu官方源已经包含JDK 17,安装最简单:
bash复制sudo apt install openjdk-17-jdk -y
验证安装:
bash复制java -version
# 应该看到类似:openjdk version "17.0.8" 2023-07-18
3.2 手动安装Oracle JDK(可选)
如果需要Oracle JDK,可以这样安装:
bash复制wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.deb
sudo dpkg -i jdk-17_linux-x64_bin.deb
配置环境变量(适用于所有JDK版本):
bash复制echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64' >> ~/.bashrc
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
4. MySQL 8.0安装与优化
4.1 安装MySQL Server
Ubuntu 22.04默认源就是MySQL 8.0:
bash复制sudo apt install mysql-server -y
安全初始化(重要!):
bash复制sudo mysql_secure_installation
这里会提示设置root密码、移除匿名用户等安全选项。
4.2 性能优化配置
编辑MySQL配置文件:
bash复制sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
建议添加以下参数(根据服务器配置调整):
ini复制[mysqld]
innodb_buffer_pool_size = 2G # 建议物理内存的50-70%
innodb_log_file_size = 256M
max_connections = 200
thread_cache_size = 10
query_cache_size = 0 # MySQL 8.0已移除查询缓存
重启生效:
bash复制sudo systemctl restart mysql
5. 环境验证与项目部署
5.1 创建项目数据库
登录MySQL:
bash复制mysql -u root -p
创建数据库和用户:
sql复制CREATE DATABASE javaproject CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'javadev'@'localhost' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON javaproject.* TO 'javadev'@'localhost';
FLUSH PRIVILEGES;
5.2 测试Java连接MySQL
准备一个测试类MySQLTest.java:
java复制import java.sql.*;
public class MySQLTest {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/javaproject";
String user = "javadev";
String password = "StrongPassword123!";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
System.out.println("MySQL连接成功!");
// 创建测试表
try (Statement stmt = conn.createStatement()) {
stmt.execute("CREATE TABLE IF NOT EXISTS test (id INT PRIMARY KEY, name VARCHAR(50))");
System.out.println("测试表创建成功");
}
} catch (SQLException e) {
System.err.println("MySQL连接失败:" + e.getMessage());
}
}
}
编译运行:
bash复制javac MySQLTest.java
java -cp .:mysql-connector-java-8.0.28.jar MySQLTest
6. 常见问题解决
6.1 JDK版本冲突
如果系统有多个JDK版本,可以用update-alternatives管理:
bash复制sudo update-alternatives --config java
6.2 MySQL连接问题
如果遇到"Access denied"错误,检查:
- 用户权限是否正确授予
- MySQL的bind-address设置(默认只允许本地连接)
- 防火墙是否放行3306端口
6.3 内存不足问题
Java项目常见OOM错误,可以调整JVM参数:
bash复制java -Xms512m -Xmx2g -XX:+UseG1GC -jar your-app.jar
7. 生产环境建议
- 使用systemd管理Java服务:
bash复制sudo nano /etc/systemd/system/javaservice.service
示例配置:
ini复制[Unit]
Description=Java Application Service
After=syslog.target network.target
[Service]
User=javauser
WorkingDirectory=/opt/yourapp
ExecStart=/usr/bin/java -Xms1G -Xmx2G -jar yourapp.jar
SuccessExitStatus=143
Restart=always
[Install]
WantedBy=multi-user.target
- MySQL定期备份:
bash复制# 每日全量备份
sudo crontab -e
0 2 * * * /usr/bin/mysqldump -u root -pYourPassword --all-databases | gzip > /backup/mysql/all_$(date +\%Y\%m\%d).sql.gz
- 监控设置:
- 使用Prometheus + Grafana监控JVM和MySQL
- 配置日志轮转(logrotate)
8. 性能调优技巧
8.1 JVM调优
对于Web应用建议参数:
bash复制-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:InitiatingHeapOccupancyPercent=35
-Xms和Xmx设置为相同值(避免动态调整开销)
8.2 MySQL索引优化
使用EXPLAIN分析慢查询:
sql复制EXPLAIN SELECT * FROM large_table WHERE create_time > '2023-01-01';
添加合适索引:
sql复制CREATE INDEX idx_create_time ON large_table(create_time);
8.3 连接池配置
建议使用HikariCP配置示例:
java复制HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/javaproject");
config.setUsername("javadev");
config.setPassword("StrongPassword123!");
config.setMaximumPoolSize(20);
config.setConnectionTimeout(30000);
config.setIdleTimeout(600000);
config.setMaxLifetime(1800000);
9. 安全加固措施
- MySQL安全:
- 定期更换密码
- 限制root远程登录
- 启用SSL连接
- 系统层面:
bash复制# 安装fail2ban防暴力破解
sudo apt install fail2ban -y
# 配置防火墙
sudo ufw allow 22/tcp
sudo ufw allow 8080/tcp # 根据你的应用端口调整
sudo ufw enable
- Java应用安全:
- 使用最新安全补丁
- 禁用不安全的加密算法
- 对用户输入严格验证
10. 容器化部署方案(可选)
如果考虑使用Docker,可以这样部署:
- MySQL容器:
bash复制docker run --name mysql8 \
-e MYSQL_ROOT_PASSWORD=YourRootPassword \
-e MYSQL_USER=javadev \
-e MYSQL_PASSWORD=StrongPassword123! \
-e MYSQL_DATABASE=javaproject \
-p 3306:3306 \
-v /data/mysql:/var/lib/mysql \
-d mysql:8.0 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci
- Java应用容器:
dockerfile复制FROM openjdk:17-jdk-slim
WORKDIR /app
COPY target/yourapp.jar .
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "yourapp.jar"]
构建运行:
bash复制docker build -t java-app .
docker run -d --name myapp -p 8080:8080 --link mysql8:mysql java-app
