【maven】

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。三者区别
  1. pom: <packaging>pom</packaging>用在父级工程或聚合工程中,用来做jar包的版本控制,指明这个聚合工程的打包方式为pom。只是用来帮助其他模块构建的工具,本身并没有实质的内容。jar和war用在moudle子工程中。

  2. jar: 默认的打包方式,如moudle子工程pom文件里没有<packaging>就等同于<packaging>jar</packaging>。jar包可以通过 java -jar 直接运行。

  3. 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 只能在 中使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值