# Java构建管理

# Flag

Maven, Ivy, Grape, Gradle, Buildr, SBT, Leiningen, ant

可执行文件打包

持续集成

# Ant

Apache Ant核心

包 描述
org.apache.tools.ant 它是一个核心程序包, 其中包含核心类和接口。
org.apache.tools.ant.attribute 该程序包包含用于处理属性的类。
org.apache.tools.ant.dispatch 它包含调度的类和接口。
org.apache.tools.ant.filters 它由过滤器类和接口组成。
org.apache.tools.ant.filters.util 它包含用于过滤器的实用程序类。
org.apache.tools.ant.helper 包含帮助程序类。
org.apache.tools.ant.input 包含输入类和接口。
org.apache.tools.ant.launch 包含类。
org.apache.tools.ant.loader 包含类和接口。
org.apache.tools.ant.property 包含用于ant属性的辅助类。

Apache Ant核心任务

包 描述
org.apache.tools.ant.taskdefs 它包含核心任务类和接口。
org.apache.tools.ant.taskdefs.compilers 它包含用于编译器的类和接口。
org.apache.tools.ant.taskdefs.condition 它包含条件的类和接口。
org.apache.tools.ant.taskdefs.cvslib 包含cvs的类。
org.apache.tools.ant.taskdefs.email 电子邮件任务类和界面组。
org.apache.tools.ant.taskdefs.launcher 与启动器相关的类。
org.apache.tools.ant.taskdefs.rmic 远程方法编译器类。

Apache Ant核心类型

包 描述
org.apache.tools.ant.types 核心类型的根包。
org.apache.tools.ant.types.mappers 包含映射器类和接口。
org.apache.tools.ant.types.resolver 包含解析器类和接口。
org.apache.tools.ant.types.resources 资源类组。
org.apache.tools.ant.types.resources.comparator 资源比较器类和接口。
org.apache.tools.ant.types.resources.selectors 它包含资源选择器类和接口。
org.apache.tools.ant.types.selectors 它是选择器的根目录。
org.apache.tools.ant.types.selectors.modifiedselector 它包含修改后的选择器类和接口。
org.apache.tools.ant.types.spi 与串行外围设备接口有关的类。

Apache Ant可选任务

包 描述
org.apache.tools.ant.taskdefs.optional 它包含可选任务的类和接口。
org.apache.tools.ant.taskdefs.optional.ccm 它包含ccm任务的类和接口。
org.apache.tools.ant.taskdefs.optional.clearcase 它包含clearcase任务的类和接口。
org.apache.tools.ant.taskdefs.optional.depend 它包含依赖任务的类和接口。
org.apache.tools.ant.taskdefs.optional.depend.constantpool 它包含constaint任务的类和接口。
org.apache.tools.ant.taskdefs.optional.ejb 它包含ejb任务的类和接口。
org.apache.tools.ant.taskdefs.optional.extension 它包含扩展任务的类和接口。
org.apache.tools.ant.taskdefs.optional.extension.resolvers 它包含解析程序任务的类和接口。
org.apache.tools.ant.taskdefs.optional.i18n 它包含i18n任务的类和接口。
org.apache.tools.ant.taskdefs.optional.image 它包含图像任务的类和接口。
org.apache.tools.ant.taskdefs.optional.j2ee 它包含j2ee任务的类和接口。
org.apache.tools.ant.taskdefs.optional.javacc 它包含javacc task的类和接口。
org.apache.tools.ant.taskdefs.optional.javah 它包含javah任务的类和接口。
org.apache.tools.ant.taskdefs.optional.jdepend 它包含jdepend任务的类和接口。
org.apache.tools.ant.taskdefs.optional.jlink 它包含jlink任务的类和接口。
org.apache.tools.ant.taskdefs.optional.jsp 它包含jsp任务的类和接口。
org.apache.tools.ant.taskdefs.optional.jsp.compilers 它包含编译器任务的类和接口。
org.apache.tools.ant.taskdefs.optional.junit 它包含junit任务的类和接口。
org.apache.tools.ant.taskdefs.optional.junitlauncher 它包含junitlauncher任务的类和接口。
org.apache.tools.ant.taskdefs.optional.native2ascii 它包含native2ascii任务的类和接口。
org.apache.tools.ant.taskdefs.optional.net 它包含网络任务的类和接口。
org.apache.tools.ant.taskdefs.optional.pvcs 它包含pvcs任务的类和接口。
org.apache.tools.ant.taskdefs.optional.script 它包含脚本任务的类和接口。
org.apache.tools.ant.taskdefs.optional.sos 与SourceOffSite源代码控制系统一起使用的Ant任务。
org.apache.tools.ant.taskdefs.optional.sound 它包含声音任务的类和接口。
org.apache.tools.ant.taskdefs.optional.splash 它包含启动任务的类和接口。
org.apache.tools.ant.taskdefs.optional.ssh 它包含ssh任务的类和接口。
org.apache.tools.ant.taskdefs.optional.testing 它包含测试任务的类和接口。
org.apache.tools.ant.taskdefs.optional.unix 它包含Unix任务的类和接口。
org.apache.tools.ant.taskdefs.optional.vss 它包含vss task的类和接口。
org.apache.tools.ant.taskdefs.optional.windows 它包含Windows任务的类和接口。
org.apache.tools.ant.taskdefs.optional.xz 它包含xz任务的类和接口。

Apache Ant可选类型

包 描述
org.apache.tools.ant.types.optional 可选的类型类和接口。
org.apache.tools.ant.types.optional.depend 依赖类型类和接口。
org.apache.tools.ant.types.optional.image 包含图像类型类和接口。
org.apache.tools.ant.types.optional.xz 包含xz类型类。

Apache Ant实用程序

包 描述
org.apache.tools.ant.util 组织util类和接口。
org.apache.tools.ant.util.depend 一组依赖类。
org.apache.tools.ant.util.depend.bcel Bcel实用程序类和接口。
org.apache.tools.ant.util.facade 外观类和接口。
org.apache.tools.ant.util.java15 Java15类。
org.apache.tools.ant.util.optional 可选的类和接口。
org.apache.tools.ant.util.regexp 处理正则表达式的类。

其他

包 描述
org.apache.tools.bzip2 由bzip类和接口组成。
org.apache.tools.mail 包含邮件类。
org.apache.tools.tar 组织课程以处理tar。
org.apache.tools.zip 邮编类和子类。

# Maven

Maven 的设计哲学是:环境必须先于构建就绪。依赖包属于“环境”的一部分。插件执行属于“构建”的一部分。

Maven 的运行顺序:

  • 阶段 0 (项目模型构建与依赖解析The Hidden "Phase 0"):Maven 读取 pom.xml,看到 <dependencies> 里的 Jar 包,立即尝试去仓库下载。
  • 阶段 1 (执行生命周期Lifecycle Execution):下载并确认所有依赖都存在后,才开始执行 三套相互独立的生命周期:Clean Lifecycle (清理)、Default Lifecycle (构建核心)、Site Lifecycle (生成站点文档)。

Default Lifecycle的执行顺序是严格线性的:

顺序 阶段 (Phase) 描述 常用插件/操作
1 validate 验证项目结构是否正确,必要信息是否完整。 maven-enforcer-plugin
2 initialize 初始化构建状态,设置属性。
3 generate-sources 生成源码(如 Protobuf, Lombok 处理等)。
4 process-sources 处理源码(如过滤占位符)。 maven-resources-plugin
5 compile 编译项目的源代码。 maven-compiler-plugin
6 process-classes 对编译生成的文件进行后处理。
7 generate-resources 生成资源文件。
8 process-resources 复制并处理资源文件到目标目录。 maven-resources-plugin
9 test-compile 编译测试源代码。 maven-compiler-plugin
10 test 运行单元测试。 maven-surefire-plugin
11 package 打包成可发布的格式(jar, war)。 maven-jar-plugin
12 verify 运行检查以验证包的有效性。
13 install 将包安装到本地 Maven 仓库(供本地其他项目使用)。 maven-install-plugin
14 deploy 将包部署到远程仓库(私服)。 maven-deploy-plugin
  • 如果运行 mvn compile,Maven 会执行 1~5。
  • 如果运行 mvn package,Maven 会执行 1~11。
  • 如果运行 mvn install,Maven 会执行 1~13。

仓库

插件

Maven镜像

更多镜像源

打包编译到Docker部署

打包部署到服务器

# Maven命令

maven 命令的格式为 mvn [plugin-name]:[goal-name]

  • -D 指定参数,如 -Dmaven.test.skip=true 跳过单元测试;`
  • -P 指定 Profile 配置,可以用于区分环境;`
  • -e 显示maven运行出错的信息
  • -o 离线执行命令,即不去远程仓库更新包
  • -X 显示maven允许的debug信息
  • -U 强制去远程更新snapshot的插件或依赖,默认每天只更新一次
  • 创建maven项目: mvn archetype:create
  • 指定 group: -DgroupId=packageName
  • 指定 artifact: -DartifactId=projectName
  • 创建web项目: -DarchetypeArtifactId=maven-archetype-webapp
  • 创建maven项目: mvn archetype:generate
  • 验证项目是否正确: mvn validate
  • maven 打包: mvn package
  • 只打jar包: mvn jar:jar
  • 生成源码jar包: mvn source:jar
  • 产生应用需要的任何额外的源代码: mvn generate-sources
  • 编译源代码: mvn compile
  • 编译测试代码: mvn test-compile
  • 运行测试: mvn test
  • 运行检查: mvn verify
  • 清理maven项目: mvn clean
  • 生成eclipse项目: mvn eclipse:eclipse
  • 清理eclipse配置: mvn eclipse:clean 删除.settings、.project、.classpath、.factorypath
  • 生成idea项目: mvn idea:idea
  • 安装项目到本地仓库: mvn install
  • 发布项目到远程仓库: mvn:deploy
  • 在集成测试可以运行的环境中处理和发布包: mvn integration-test
  • 显示maven依赖树: mvn dependency:tree
  • 显示maven依赖列表: mvn dependency:list
  • 下载依赖包的源码: mvn dependency:sources

web项目相关命令

  • 启动tomcat: mvn tomcat:run
  • 启动jetty: mvn jetty:run
  • 运行打包部署: mvn tomcat:deploy
  • 撤销部署: mvn tomcat:undeploy
  • 启动web应用: mvn tomcat:start
  • 停止web应用: mvn tomcat:stop
  • 重新部署: mvn tomcat:redeploy
  • 部署展开的war文件: mvn war:exploded tomcat:exploded

# 使用本地jar包

将jar包安装到本地Maven仓库中

mvn install:install-file -Dfile=C:\Users\xx\Desktop\test-1.0-SNAPSHOT.jar -DgroupId=com.bajins -DartifactId=test -Dversion=1.0 -Dpackaging=jar

  • -Dfile:指定要安装的文件的路径。
  • -DgroupId:指定项目的groupId。
  • -DartifactId:指定项目的artifactId。
  • -Dversion:指定项目的版本号。
  • -Dpackaging:指定项目的打包类型。
  • Eclipse -> File -> Import -> Maven -> Install or deply an artifact to a Maven reposeitory -> Next -> Install artifact
  • Eclipse -> 项目右键 -> Maven -> Update Project

引用本地jar包,非引用本地Maven仓库

<dependency>
    <groupId>com.xxx</groupId>
    <artifactId>xxx-sdk</artifactId>
    <version>${xxxSDK.version}</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/xxxSDK.jar</systemPath>
</dependency>

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <!-- 加以下配置 打包时包括引用的本地jar -->
    <configuration>
        <includeSystemScope>true</includeSystemScope>
    </configuration>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
        <configuration>
            <webResources>
                <resource>
                    <!-- 拷贝指定文件夹下的文件到指定目录 -->
                    <directory>${project.basedir}/lib</directory>
                    <targetPath>WEB-INF/lib</targetPath>
                    <filtering>false</filtering>
                    <includes>
                        <include>**/*.jar</include>
                    </includes>
                </resource>
            </webResources>
        </configuration>
    <version>2.1.1</version>
</plugin>

# Maven私服搭建

# 常见问题

Maven3.8.1+禁止访问HTTP协议的仓库

正常情况下访问HTTP仓库会自动重定向访问http://0.0.0.0/导致报错:from/to maven-default-http-blocker (http://0.0.0.0/): Blocked mirror for repositories:

  • 使用低版本Maven
  • 命令行参数:-Dmaven.allow.insecure.protocol=true
  • 添加以下配置到Maven的settings.xml文件中的<settings>下的<mirrors>标签中
<!-- Maven 3.8.1+ 默认禁止通过 HTTP 协议访问远程仓库(安全限制)maven-default-http-blocker -->
<mirror>
    <id>allow-http</id>
    <mirrorOf>*</mirrorOf>
    <!-- <mirrorOf>external:http:*</mirrorOf>   external:http:* 表示允许所有外部的 HTTP 请求 -->
    <url>http://xxxx.com/repository/maven-public/</url> <!-- 配置为允许访问的仓库地址 -->
    <blocked>false</blocked> <!-- 允许 HTTP -->
</mirror>