maven
web项目如果不使用maven,就要自己去官网下载jar包,然后放在WEB-INF/lib 下。
项目发布需要手动打jar包,而项目间有被依赖,还要根据依赖关系依次重新打包和更新jar到lib目录。
…
命令
创建 maven java项目
mvn archetype:create \
-DgroupId=com.demo.maven.quickstart \
-DartifactId=myDemo \
-DarchetypeArtifactId=maven-archetype-quickstart \
-Dversion=0.01-snapshot
解释:
archetype:create # 创建项目
-DgroupId # 项目的 groupId:包名、公司的域名的反写
-DartifactId # 项目的 artifactId:项目名称
-DarchetypeArtifactId=maven-archetype-quickstart # 写死的,表示创建的是java项目
创建的maven项目(使用命令行或idea中)都会自动构建出
src/main/java、src/main/resources
src/test
/target
的结构,.class文件放入target目录。
创建 maven web 项目
mvn archetype:create \
-DgroupId=com.demo.maven.webapp \
-DartifactId=myWebApp \
-DarchetypeArtifactId=maven-archetype-webapp \
-Dversion=0.0.1-snapshot
创建的webapp项目会自动构建出 web结构。
maven 操作命令
在pom.xml 同级目录下执行,完成对当前项目操作
- 编译 src/main
mvn compile
# 将src/main/java目录下的java源码编译成.class、和src/main/resources文件编译到target目录下classes文件夹里
- 编译 src/test
mvn test
# 将src/test/java目录下的javaTest编译成.class文件放到target目录下test-classes文件夹里,并运行单元测试
- 清理
mvn clean
# 删除target目录内容,也就是删除target目录下classes文件和jar/war包等等...
- 打包
mvn package
# 生成压缩文件:java项目#jar包;web项目#war包,也是放在target目录下
- 安装
mvn install
# 将压缩文件(jar或者war)上传到本地仓库,可供本地其他项目调用
- 部署|发布
mvn deploy
# 将压缩文件上传私服,可供其他开发人员调用
maven项目的生命周期
上述命令就是对应maven生命周期。
验证 validate 验证项目 验证项目是否正确且所有必须信息是可用的
编译 compile 对src/main/java执行编译,源代码和配置文件等
测试 test 对src/test/java执行编译
打包 package 创建JAR/WAR包,放到target中
检查 verify 对集成测试的结果进行检查,以保证质量达标
安装 install 拷贝安装打包的项目到本地仓库,以供本地其他项目使用
部署 deploy 拷贝安装打包的项目到远程仓库,以共享给其他开发人员使用
当一个阶段通过 Maven 命令调用时,例如 mvn compile,只有该阶段之前以及包括该阶段在内的所有阶段会被执行。
- 如使用 mvn compile
Maven 将会开始处理并显示直到编译阶段的构建生命周期的 validate、compile阶段
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------
[INFO] Building Unnamed - com.companyname.projectgroup:project:jar:1.0
[INFO] task-segment: [compile]
[INFO] ------------------------------------------------------------------
[INFO] [antrun:run {execution: id.validate}]
// ...
[INFO] [antrun:run {execution: id.compile}]
// ...
[INFO] BUILD SUCCESSFUL
-
如使用 mvn package : 会依次执行 clean、resources、compile、test、package,并将打好的war(jar)包生成在 target下
-
如使用 mvn install : 会依次执行 clean、resources、compile、test、package、install,war(jar)包生成在 target下,同时根据包名安装到本地仓库
特别注意一点。mvn test 有两部分阶段:会将src/test里的内容也编译到 target/test-calsses,同时执行单元测试里的代码。 使用 mvn package 会触发 mvn test,如果src/test里assert不通过,会导致打包失败'There are test failures.'。 如果期望在mvn package时忽略单元测试,可以在命令里添加 -DskipTests,也可以在idea里设置 Toggle 'Skip Tests' Mode,则对src/test下的内容只编译,不执行test代码。(mvn test 也可以 skip tests 就只会编译)
war包与jar包
jar包是把类和相关的资源封装到压缩的归档文件中,对于spring boot项目会将内置tomcat一并打包。
war包代表了一个Web应用程序,它可以包含 Servlet、HTML页面、Java类、图像文件,以及组成Web应用程序的其他资源。
pom文件里 <packaging> 标签可以是pom\jar\war。三者区别
-
pom: <packaging>pom</packaging>用在父级工程或聚合工程中,用来做jar包的版本控制,指明这个聚合工程的打包方式为pom。只是用来帮助其他模块构建的工具,本身并没有实质的内容。jar和war用在moudle子工程中。
-
jar: 默认的打包方式,如moudle子工程pom文件里没有<packaging>就等同于<packaging>jar</packaging>。jar包可以通过 java -jar 直接运行。
-
war: 打包成war,发布在服务器上,如网站或服务,war
打jar包时可增加明细配置:(g/a/v是指打包时使用maven插件的信息,mainClass 指定jar的程序运行入口)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.demo.App</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
直接执行这个jar:
> java -jar .\demo-1.0-SNAPSHOT.jar
9
包中有多个含main方法的主类而打包时没有指定mainClass,还对这个jar运行的话会报错
【.\demo-1.0-SNAPSHOT.jar中没有主清单属性】
命令中解决:java -jar .\demo-1.0-SNAPSHOT.jar com.demo.App // jar命令后面指定main方法所在主类即可,省去一次重新打包
补充:jdk9 后还可以打包 jmod(Java 模块化),通过 jlink 命令,可以直接将 jmod 打包为对应环境的可执行的程序,告别了安装 jdk 的步骤。
maven命令的可选参数
如编译hive源码
mvn clean compile \
-Phadoop-2 \
mvn clean package \
-Phadoop-2 \
-DskipTests
如编译spark 源码时用到
./build/mvn clean package \
-Phadoop-3.2 \
-Pyarn \
-Dhadoop.version=3.2.2 \
-Phive \
-Phive-thriftserver \
-DskipTests
-P 和 -D 是命令的可选参数,使用 mvn --help 查看参数解释:
-P :activate-profiles激活配置文件,多个用逗号分隔;
-D: Define a system property定义系统属性(-DskipTests 就是要跳过mvn test步骤,也就是编译、打包时忽略 src/test 下的内容)
格式:短横线指定一项参数内容,空格作为分隔。
idea里面VM options 设置jvm参数(-Djline.WindowsTerminal.directConsole=false -XX:StringTableSize=60013),
和Program arguments设置调用主类的时传入参数args也是这个格式。
安装到本地仓库
mvn install:install-file -DgroupId=org.csource -DartifactId=fastdfs-client -Dversion=1.2 -Dpackaging=jar -Dfile=d:\**\**.jar
-DgroupId=生成到本地仓库的目录 对应 groupId
-DartifactId=对应在pom.xml里导包那个artifactId
-Dversion=版本号 对应version
-Dpackaging=下载到本地的.jar目录(来源)
安装后可以在本地仓库找到jar包
repository\org\csource\fastdfs-client\1.2
需要引入到其他工程的话:
<dependency>
<groupId>org.csource</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.2</version>
</dependency>
<dependency>中 <scope> 代表的意义
参考https://blog.csdn.net/keepfriend/article/details/123181254
在Maven中依赖的域有: compile、provided、runtime、system、test、import。
编译阶段 | 单元测试阶段 | 运行阶段 | |
---|---|---|---|
compile(默认) | √ | √ | √ |
provided | √ | √ | |
runtime | √ | √ | |
test | √ | ||
system | √ | √ |
-
provided
当依赖的scope为provided的时候,在编译和测试的时候有效,在执行(mvn package)进行打包时不会加入。比如, 我们开发一个web应用,在编译时我们需要依赖servlet-api.jar,但是在运行时我们不需要该 jar包,因为这个jar 包已由web服务器提供,如果在打包时又被加入进去,那么就可能产生冲突。此时我们就可以使用 provided 进行范围修饰。 -
runtime
当依赖的scope为runtime的时候,在测试、运行的时候有效,在编译的时候不会依赖。如JDBC驱动包只需要在运行时才需要。就可以使用 runtime 进行范围修饰。 -
test
当依赖的scope为test的时候,只在测试时候有效,在编译与运行的时候都不会使用这个依赖。如单元测试的依赖,当然只会在单元测试时才使用。就可以使用test进行范围修饰。<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
-
system
依赖项不会从maven仓库获取,而是从本地文件系统拿,需要配合systemPath属性使用。比如<dependency> <groupId>org.open</groupId> <artifactId>open-core</artifactId> <version>1.5</version> <scope>system</scope> <systemPath>${basedir}/lib/open-core.jar</systemPath> </dependency>
-
import
import 表示从其它的pom文件中导入dependency配置,import 只能在 中使用。