Java 程序编译
源代码克隆与编译过程说明
以 Github 上 Java 开源项目 dubbo-admin 为例
github 说明:
https://github.com/apache/dubbo-admin/
官方部署过程
Production Setup
Clone source code on develop branch git clone https://github.com/apache/dubbo-admin.git
Specify registry address in dubbo-admin-
server/src/main/resources/application.properties
Build
mvn clean package -Dmaven.test.skip=true
Start
mvn --projects dubbo-admin-server spring-boot:run
OR
cd dubbo-admin-distribution/target; java -jar dubbo-admin-0.1.jar
Visit http://localhost:8080
Default username and password is root
Maven 部署准备
Maven 介绍
Maven 翻译为"专家"、"内行",是 Apache 基金会旗下的一个纯 Java 开发的开源项目
Maven 是一个项目管理工具,可以对 Java项目进行构建、解决打包依赖等。
它为开发者提供了一套完整的构建生命周期框架,开发团队稍微投入一些时间就能够自动完成工程的基础构建配置;在有多个开发团队环境的情况下,Maven 能够在很短的时间内使得每项工作都按照标准进行;那是因为大部分的工程配置操作都非常简单并且可复用
Maven基干项目对象模型(POM project object model),它可以通过一小段描述信息(配置)来管理项目的构建;因而,每个maven项目都有一个pom.xml文件
POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个 XML 文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖等,在执行任务或目标时,Maven 会在当前目录中查找 pom 文件,通过读取pom文件获取所需的配置信息,然后执行目标。本质上,每个Maven项目都包含一个POM文件,该文件定义每个项目的对应的相关信息
pom.xml 文件中可以指定以下配置:
项目依赖
插件
执行目标
项目构建 profile
项目版本
项目开发者列表 相关邮件列表信息
用<packaging> 指定项目打包形式,jar或者war
Maven使用POM来决定不同的构建动作,及制品的生成等
- 首先,它将在本地repo搜索指定的依赖,而后是Maven的repo服务
- 若配置了远程repo服务,Maven还是搜索该repo
- Maven默认使用的是其官方存储库,在因内的下载速度较慢,因而建议使用因内的Maven镜像仓库,例如阿里的镜像仓库等
Java 项目的源码的通用目录结构
src/main/目录
java:项目的源代码所在的目录
resources:项目的资源文件所在的目录
filters:项目的过滤器文件所在的目录
src/test/目录
java:测试代码所在的目录
resources:测试相关的资源文件目录
filters:测试相关的过滤器文件目录
maven 官网
https://maven.apache.org/
maven 官方仓库 :
https://repo.maven.apache.org/
maven 下载
#官方
https://maven.apache.org/download.cgi
#清华镜像源
http://mirrors.tuna.tsinghua.edu.cn/apache/maven
#官方各版本下载地址,推荐使用次新版本
https://archive.apache.org/dist/maven/maven-3
安装maven前必须安装java 环境:
Maven 3.3 要求 JDK 1.7 或以上
Maven 3.2 要求 JDK 1.6 或以上
Maven 3.0/3.1 要求 JDK 1.5 或以上
注意: Maven所安装JDK的版本不影响编译应用的所依赖的JDK版本,比如Maven安装JDK11,而java应用Jpress 可以使用JDK8
maven 安装
安装方式1: 包安装
范例: Ubuntu22.04 安装 maven
[root@ubuntu2204 ~]#apt update && apt -y install maven
[root@ubuntu2204 ~]#mvn -version
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 11.0.17, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-
amd64
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "5.15.0-52-generic", arch: "amd64", family: "unix"
范例:Ubuntu20.04 安装 maven
[root@ubuntu2004 ~]#apt -y install maven
#自动安装Openjdk11
[root@ubuntu2004 ~]#java -version
openjdk version "11.0.15" 2022-04-19
OpenJDK Runtime Environment (build 11.0.15+10-Ubuntu-0ubuntu0.20.04.1)
OpenJDK 64-Bit Server VM (build 11.0.15+10-Ubuntu-0ubuntu0.20.04.1, mixed mode,
sharing)
[root@ubuntu2004 ~]#mvn -v
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 11.0.15, vendor: Private Build, runtime: /usr/lib/jvm/java-11-
openjdk-amd64
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "5.4.0-110-generic", arch: "amd64", family: "unix"
#镜像加速
[root@ubuntu2004 ~]#vim /etc/maven/settings.xml
#大约在159行
......
<mirrors>
<!--阿里云镜像-->
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
......
范例:Ubuntu18.04安装 maven
[root@ubuntu1804 ~]#apt list maven -a
Listing... Done
maven/bionic-security,bionic-security,bionic-updates,bionic-updates,now 3.6.0-
1~18.04.1 all [installed]
maven/bionic,bionic 3.5.2-2 all
[root@ubuntu1804 ~]#apt -y install maven
[root@ubuntu1804 ~]#mvn -v
Apache Maven 3.6.0
Maven home: /usr/share/maven
Java version: 11.0.11, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-
amd64
Default locale: en_HK, platform encoding: UTF-8
OS name: "linux", version: "4.15.0-112-generic", arch: "amd64", family: "unix"
#镜像加速
[root@ubuntu1804 ~]#vim /etc/maven/settings.xml
#大约在159行
......
<mirrors>
<!--阿里云镜像-->
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
......
范例: Rocky/CentOS/RHEL安装maven
[root@rocky8 ~]#yum -y install maven
[root@rocky8 ~]#mvn -v
Apache Maven 3.5.4 (Red Hat 3.5.4-5)
Maven home: /usr/share/maven
Java version: 1.8.0_292, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-
1.8.0-openjdk-1.8.0.292.b10-1.el8_4.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.18.0-305.3.1.el8_4.x86_64", arch: "amd64", family:
"unix"
#镜像加速
[root@rocky8 ~]#vim /etc/maven/settings.xml
......
<mirrors>
<!--阿里云镜像-->
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
......
安装方式2: 二进制安装
官方说明:
https://maven.apache.org/install.html
范例: 二进制安装
[root@ubuntu1804 ~]#apt update
[root@ubuntu1804 ~]#apt install openjdk-8-jdk -y
[root@ubuntu1804 ~]#java -version
openjdk version "1.8.0_282"
OpenJDK Runtime Environment (build 1.8.0_282-8u282-b08-0ubuntu1~18.04-b08)
OpenJDK 64-Bit Server VM (build 25.282-b08, mixed mode)
[root@ubuntu1804 ~]#wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
[root@ubuntu1804 ~]#tar xf apache-maven-3.6.3-bin.tar.gz -C /usr/local/
[root@ubuntu1804 ~]#ln -s /usr/local/apache-maven-3.6.3/ /usr/local/maven
[root@ubuntu1804 ~]#echo 'PATH=/usr/local/maven/bin:$PATH' >/etc/profile.d/maven.sh
[root@ubuntu1804 ~]#echo 'export MAVEN_HOME=/usr/local/maven' >> /etc/profile.d/maven.sh
[root@ubuntu1804 ~]#. /etc/profile.d/maven.sh
[root@ubuntu1804 ~]#mvn -v
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /usr/local/maven
Java version: 1.8.0_282, vendor: Private Build, runtime: /usr/lib/jvm/java-8-
openjdk-amd64/jre
Default locale: en_HK, platform encoding: UTF-8
OS name: "linux", version: "4.15.0-112-generic", arch: "amd64", family: "unix"
#二进制安装的镜像加速
[root@ubuntu1804 ~]#vim /usr/local/maven/conf/settings.xml
......
<mirrors>
<!--阿里云镜像-->
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
......
Maven 的打包命令说明
Maven工程构建的各个环节
- clean: 以前编译得到的旧文件class字节码文件删除
- compile:将java源程序编译成class字节码文件
- test:自动测试,例如,自动调用junit程序
- report:报告测试程序执行的结果
- package:应用打包,动态Web工程打成war包,java工程打成jar包
- install: 是指将打包得到的文件复制到仓库中指定的位置
- deploy:将动态Web工程生成的war包复制到Servlet容器下,使其可以运行
Maven构建的基本工作流程

- 读取pom.xml文件
- 从repository中下载pom.xml文件定义的依赖项
- 根据需求构建项目、生成报告,并处理生命周期、阶段、目标、插件和其他任务
范例:
- 进入到包含有“pom.xml”的路径,执行:
mvn clean install package
- 有的时候受到测试的干扰,导致无法正在进行编译,这时候可以选择跳过测试:
mvn clean install package -Dmaven.test.skip=true
#选项"-Dmaven.test.skip=true":跳过测试,并且不编译测试下的源代码
#选项"-DskipTests":不执行测试,但是会进行测试代码的编译
- 如果需要编译的代码很庞大,需要考虑对编译环境做一些处理,提成编译效率:
#启动多线程编译:
mvn -T 4 clean install package -Dmaven.test.skip=true
#分配编译的 CPU 个数:
mvn -T 2C clean install package -Dmaven.test.skip=true
#启用多线程编译:
mvn clean install package -Dmaven.test.skip=true -Dmaven.compile.fork=true
- 所有的 Maven 都是建立在 JVM 上的,所以进行编译的时候还需要考虑JVM 参数优化:
#如果是windows
找到“maven/bin/mvn.cmd”,如果 linux 找到“maven/bin/mvn”,配置参数是:“MAVEN_OPTS”
#打开属性配置文件:
vim /etc/profile
#指定内存配置:
export MAVEN_OPTS="-Xmx6g -Xms6g" 注意不要超过物理内存一半
#使配置立即生效:
source /etc/profile
Java 源代码编译实战案例
编译安装 spring-boot 项目
[root@ubuntu1804 ~]#apt -y install maven git
#镜像加速
[root@ubuntu1804 ~]#vim /etc/maven/settings.xml
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
[root@ubuntu1804 ~]#cd /data
[root@ubuntu1804 data]#git clone https://gitee.com/lbtooth/spring-boot-helloWorld.git
[root@ubuntu1804 data]#cd spring-boot-helloWorld/
[root@ubuntu1804 spring-boot-helloWorld]#ls
deploy Dockerfile Jenkinsfile LICENSE pom.xml README.md src
[root@ubuntu1804 spring-boot-helloWorld]#ls src
main test
#编译
[root@ubuntu1804 spring-boot-helloWorld]#mvn -T 4 clean package -Dmaven.test.skip=true
.....
[INFO] --- maven-jar-plugin:3.1.1:jar (default-jar) @ spring-boot-helloworld ---
[INFO] Building jar: /root/spring-boot-helloWorld/target/spring-boot-helloworld-
0.9.0-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:2.1.3.RELEASE:repackage (repackage) @
spring-boot-helloworld ---
[INFO] Replacing main artifact with repackaged archive
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 57.183 s (Wall Clock)
[INFO] Finished at: 2022-06-15T09:53:14+08:00
[INFO] ------------------------------------------------------------------------
[root@ubuntu1804 spring-boot-helloWorld]#ls target/
classes maven-archiver spring-boot-
helloworld-0.9.0-SNAPSHOT.jar.original
generated-sources maven-status surefire-
reports
generated-test-sources spring-boot-helloworld-0.9.0-SNAPSHOT.jar test-classes
#默认为8080端口
[root@ubuntu1804 spring-boot-helloWorld]#java -jar target/spring-boot-helloworld-0.9.0-SNAPSHOT.jar --server.port=8888
编译 java 程序 Jpress
注意:Jpress-v5.1.0支持maven-3.6.3基于JDK8的编译,不支持maven-3.6.3JDK11,不支持maven-3.9.2和openjdk-1.8.0_362, 但可以运行在JDK8或JDK11上
#下载源码
[root@rocky8 ~]#git clone https://gitee.com/JPressProjects/jpress.git
#或者
[root@rocky8 ~]#wget -O jpress-v4.2.0.tar.gz 'https://gitee.com/JPressProjects/jpress/repository/archive/v4.2.0?format=tar.gz'
[root@rocky8 ~]#tar xf jpress-v4.2.0.tar.gz
[root@rocky8 ~]#cd jpress-v4.2.0/
[root@rocky8 jpress-v4.2.0]#ls
changes.txt docker Dockerfile jpress-commons jpress-service
jpress-template module-article pom.xml starter-tomcat
codegen docker-build.sh install.sh jpress-core jpress-service-
provider jpress-web module-page README.md upgrade.sh
doc docker-compose.yml jpress-addons jpress-model jpress.sql
LICENSE module-product starter
[root@rocky8 jpress-v4.2.0]#mvn clean install package -Dmaven.test.skip=true
...
[INFO] module-product-search-db ........................... SUCCESS [ 0.095 s]
[INFO] module-product-search-lucene ....................... SUCCESS [ 0.101 s]
[INFO] module-product-search-es ........................... SUCCESS [ 0.160 s]
[INFO] module-product-search-opensearch ................... SUCCESS [ 0.120 s]
[INFO] module-product-service-provider .................... SUCCESS [ 0.228 s]
[INFO] module-product-web ................................. SUCCESS [ 0.274 s]
[INFO] starter ............................................ SUCCESS [01:20 min]
[INFO] starter-tomcat 4.0 ................................. SUCCESS [ 8.736 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 03:00 min
[INFO] Finished at: 2021-12-15T18:18:06+08:00
[INFO] ------------------------------------------------------------------------
[root@rocky8 jpress-v4.2.0]#cp starter-tomcat/target/starter-tomcat-4.0.war /usr/local/tomcat/webapps/jpress.war