写在 plugins 里的
没有引入依赖包 , 看左侧的依赖树就知道
打成 jar 包的时候 ( a包 ) , 不会把依赖包也放进来 , 不然就超大
依赖包的信息在 a包的 pom.xml 文件里
todo
解析 用 json 格式写的 maven pom.xml 文件
在执行任何一个生命周期步骤的时候
如果发现上一个没有执行
会自动先执行上一个
依次递归上去
比如正常步骤是
package ( mvn package ) 的时候发现 test 没有执行 , 因为
目录下没有生成
目录
先执行 test
test 的时候发现 compile 没有执行 , 因为
目录下没有生成
目录
先执行 compile
如果想跳过 package 之前的 test , 加上参数 / 跳过test / 跳过 test
-Dmaven.test.skip=true -Ptest
mvn install 命令执行后 提示
jar 路径 :
[INFO] Installing E:Mavenpure-maven-plugin argetpure-maven-plugin-1.0-SNAPSHOT.jar to F:
epositorypuresamplepluginpure-maven-plugin1.0-SNAPSHOTpure-maven-plugin-1.0-SNAPSHOT.jar
pom.xml 路径
[INFO] Installing E:Mavenpure-maven-pluginpom.xml to F:
epositorypuresamplepluginpure-maven-plugin1.0-SNAPSHOTpure-maven-plugin-1.0-SNAPSHOT.pom
因为配置 :
puresamplepluginpure-maven-plugin1.0-SNAPSHOT 文件夹下的 pure-maven-plugin-1.0-SNAPSHOT.jar 文件
<groupId>pure.sample.plugin</groupId>
<artifactId>pure-maven-plugin</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
1
puresamplepluginpure-maven-plugin1.0-SNAPSHOT 文件夹下的 pure-maven-plugin-1.0-SNAPSHOT.jar 文件
2
3
<groupId>pure.sample.plugin</groupId>
4
<artifactId>pure-maven-plugin</artifactId>
5
<packaging>jar</packaging>
6
<version>1.0-SNAPSHOT</version>
IDEA使用Maven命令
https://www.cnblogs.com/not-alone/articles/7802966.html
mvn package 自动调用 mvn test
然后如果发现没有 junit 依赖包 ( 在 pom.xml 里面配置 ) , 就会报错
换个命令行 : mvn package -Dmaven.test.skip=true -Ptest
maven 参数的 key value 中间的等号左右不能有空格
{
例如不能写
mvn package -Dmaven.test.skip = true -Ptest
报错的部一分 : 无法转换 "="
[WARNING] The requested profile "test" could not be activated because it does not exist.
[ERROR] Unknown lifecycle phase "="...
1
[WARNING] The requested profile "test" could not be activated because it does not exist.
2
[ERROR] Unknown lifecycle phase "="...
应该写
mvn package -Dmaven.test.skip=true -Ptest
结果 :
[INFO] --- pure-maven-plugin:1.0-SNAPSHOT:sayhi (default) @ my-app ---
[INFO] Hello, world.
1
[INFO] --- pure-maven-plugin:1.0-SNAPSHOT:sayhi (default) my-app ---
2
[INFO] Hello, world.
}
打开的maven项目不是在根目录 , 而是在更上一级的目录
创建插件项目的命令行结构 : 删除 "" , 不要换行 , 替换掉红色的
To create a new plugin project, you could using the Mojo archetype with the following command line:
mvn archetype:generate
-DgroupId=sample.plugin
-DartifactId=hello-maven-plugin
-DarchetypeGroupId=org.apache.maven.archetypes
-DarchetypeArtifactId=maven-archetype-plugin
举例 :
想要这样的效果 , 写命令行 :
<groupId>sample.plugin</groupId>
<artifactId>hello-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>maven-plugin</packaging>
1
<groupId>sample.plugin</groupId>
2
<artifactId>hello-maven-plugin</artifactId>
3
<version>1.0-SNAPSHOT</version>
4
<packaging>maven-plugin</packaging>
mvn archetype:generate -DgroupId=sample.plugin -DartifactId=hello-maven-plugin -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-plugin
1
mvn archetype:generate -DgroupId=sample.plugin -DartifactId=hello-maven-plugin -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-plugin
创建项目
自己写个插件
{
一个插件就是一个普通Maven 结构的项目
用 Maven 编译打包这个插件
Project Object Model (POM)
MOJO is a play on POJO (Plain-old-Java-object), substituting "Maven" for "Plain".
name your plugin <yourplugin>-maven-plugin
Plugin Development Center
https://maven.apache.org/plugin-developers/index.html
Configuring plugins
https://maven.apache.org/guides/mini/guide-configuring-plugins.html
插件相关的 api 文档 Mojo API Specification.
https://maven.apache.org/ref/3.5.3/maven-core/apidocs/org/apache/maven/plugin/PluginParameterExpressionEvaluator.html
编译 的时候少了一个依赖包
在idea 里面打包的时候测试依赖一定要有
编译后安装到本地
另一个项目引用这个插件 , 配置下在自己的哪个生命周期里执行这个插件
自己写个后 , 就知道怎么看别人的插件源码了
因为懂得本质是也是个项目 , 实现了 抽象类 或者 接口 的项目
}
A
B文件夹 ( 标准的 maven 项目 )
readme.md
E:MavenAblockchain-part1
打开的是 A 文件夹
idea 里面
双击右侧的 Maven 面板的 compile 按钮 :
"C:Program FilesJavajdk1.8.0_92injava" -Dmaven.multiModuleProjectDirectory=E:MavenAlockchain-part1 "-Dmaven.home=D:Program FilesJetBrainsIntelliJ IDEA 2017.2.6pluginsmavenlibmaven3" "-Dclassworlds.conf=D:Program FilesJetBrainsIntelliJ IDEA 2017.2.6pluginsmavenlibmaven3inm2.conf" "-javaagent:D:Program FilesJetBrainsIntelliJ IDEA 2017.2.6libidea_rt.jar=51248:D:Program FilesJetBrainsIntelliJ IDEA 2017.2.6in" -Dfile.encoding=UTF-8 -classpath "D:Program FilesJetBrainsIntelliJ IDEA 2017.2.6pluginsmavenlibmaven3ootplexus-classworlds-2.5.2.jar" org.codehaus.classworlds.Launcher -Didea.version=2017.2.6 -s F:
epositorysettings.xml -Dmaven.repo.local=F:
epository compile
格式化 :
"C:Program FilesJavajdk1.8.0_92injava"
-Dmaven.multiModuleProjectDirectory=E:MavenAlockchain-part1
"-Dmaven.home=D:Program FilesJetBrainsIntelliJ IDEA 2017.2.6pluginsmavenlibmaven3"
"-Dclassworlds.conf=D:Program FilesJetBrainsIntelliJ IDEA 2017.2.6pluginsmavenlibmaven3inm2.conf"
"-javaagent:D:Program FilesJetBrainsIntelliJ IDEA 2017.2.6libidea_rt.jar=51248:D:Program FilesJetBrainsIntelliJ IDEA 2017.2.6in"
-Dfile.encoding=UTF-8
-classpath "D:Program FilesJetBrainsIntelliJ IDEA 2017.2.6pluginsmavenlibmaven3ootplexus-classworlds-2.5.2.jar" org.codehaus.classworlds.Launcher
-Didea.version=2017.2.6 -s F:
epositorysettings.xml
-Dmaven.repo.local=F:
epository
compile
有的行
一点引号都不加 -Dfile.encoding=UTF-8 和 -Dmaven.repo.local=F:
epository
最左边和最右边 "-Dmaven.home=D:Program FilesJetBrainsIntelliJ IDEA 2017.2.6pluginsmavenlibmaven3"
只要右边加 -classpath "xxx路径"
https://issues.apache.org/jira/projects/MNGSITE/issues/MNGSITE-327?filter=allopenissues
Maven 官方用 jira 来跟踪问题
搭建仓库的工具和资料
{
官方推荐的
https://maven.apache.org/repository-management.html
Apache Archiva (open source)
CloudRepo (commercial)
Cloudsmith Package (commercial)
JFrog Artifactory Open Source (open source)
JFrog Artifactory Pro (commercial)
Sonatype Nexus OSS (open source)
Sonatype Nexus Pro (commercial)
}
约定大于配置
几乎都要用到的配置都不许再手动写 , 默认就是这个
比如
"是否要打包 资源文件夹 到 jar 或者 war 里 " 这个功能 ,
默认值是要打包进去 , 万一有需求 , 也可以配置成 不
Maven 要求的特定的格式
你会把一个项目普通的项目转换成Maven 结构吗 , 原来管理依赖包很初级 , 自己下载包 , 然后添加到构建路径
我不会 , 所以想看看Maven , 多学一点
解决方案 :
右击项目 , 如图
勾选 Maven 结构 , 如图
根据官方文档 实践 + 一点点问题
手动创建标准的文档结构
mian:该目录下存放的是该项目的主要代码文件,下面有三个文件夹,分别用来存放:
Java:该目录用来存放Java的源代码文件
resources:该目录主要用来存放项目的一些配置文件(比如spring的xml配置文件)。
webapp:该目录相当于web项目下webcontent的目录,用来存放js、jsp、web.xml等文件.
test:该目录用来存放项目的测试文件
Java:该目录主要存放该项目的测试所用的Java源代码。
resources:该目录存放测试使用的资源文件。
1
mian:该目录下存放的是该项目的主要代码文件,下面有三个文件夹,分别用来存放:
2
Java:该目录用来存放Java的源代码文件
3
resources:该目录主要用来存放项目的一些配置文件(比如spring的xml配置文件)。
4
webapp:该目录相当于web项目下webcontent的目录,用来存放js、jsp、web.xml等文件.
5
6
test:该目录用来存放项目的测试文件
7
Java:该目录主要存放该项目的测试所用的Java源代码。
8
resources:该目录存放测试使用的资源文件。
要先配置阿里Maven 镜像源
官方文档 没先说这个
官方的 :
mvn -B archetype:generate
-DarchetypeGroupId=org.apache.maven.archetypes
-DgroupId=com.mycompany.app
-DartifactId=my-app
要写成一行 Note that these must all be on a single line
才放到 cmd 里面执行 , 不然这条命令会断开执行 , 异常
mvn -B archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.mycompany.app -DartifactId=my-app
找不到或无法加载主类
执行 java ifast-1.0.0.jar 后报错 :
错误: 找不到或无法加载主类 ifast-1.0.0.jar
因为命令行中没有加 -jar 参数
java -jar ifast-1.0.0.jar
如果加了后报错 "没有主清单属性" , 查阅相应的解决方案
maven 打包 java 程序的清单里没有主清单属性
找不到或无法加载主类
运行和报错如下 :
java -jar my-app-1.0-SNAPSHOT.jar
my-app-1.0-SNAPSHOT.jar中没有主清单属性
1
java -jar my-app-1.0-SNAPSHOT.jar
2
my-app-1.0-SNAPSHOT.jar中没有主清单属性
分析 :
清单缺少个元素来指定 主类 / 入口类
解决方法 :
Maven POM文件中添加插件
然后在 mainClass 元素里配置主类是哪个 , 不需要描述到 main 方法
copy
artifactId 为 maven-shade-plugin 的 plugin
最新版本 3.1.0 , 2018-04-17
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>my-app</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 使打包的jar文件包含了主函数的入口 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<!-- 主函数所在的包+类 -->
<mainClass>com.mycompany.app.App</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
1
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
3
<modelVersion>4.0.0</modelVersion>
4
<groupId>com.mycompany.app</groupId>
5
<artifactId>my-app</artifactId>
6
<packaging>jar</packaging>
7
<version>1.0-SNAPSHOT</version>
8
<name>my-app</name>
9
<url>http://maven.apache.org</url>
10
11
<dependencies>
12
<dependency>
13
<groupId>junit</groupId>
14
<artifactId>junit</artifactId>
15
<version>3.8.1</version>
16
<scope>test</scope>
17
</dependency>
18
</dependencies>
19
20
21
<build>
22
<plugins>
23
24
<!-- 使打包的jar文件包含了主函数的入口 -->
25
<plugin>
26
<groupId>org.apache.maven.plugins</groupId>
27
<artifactId>maven-shade-plugin</artifactId>
28
<version>1.2.1</version>
29
<executions>
30
<execution>
31
<phase>package</phase>
32
<goals>
33
<goal>shade</goal>
34
</goals>
35
<configuration>
36
<transformers>
37
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
38
<!-- 主函数所在的包+类 -->
39
<mainClass>com.mycompany.app.App</mainClass>
40
</transformer>
41
</transformers>
42
</configuration>
43
</execution>
44
</executions>
45
</plugin>
46
47
</plugins>
48
49
</build>
50
51
</project>
52
加了插件后 , 打包出两个 jar :
my-app-1.0-SNAPSHOT 和 original-my-app-1.0-SNAPSHOT
E:Mavenmy-app arget 下的 my-app-1.0-SNAPSHOT.jar 里
完整清单如下 :
Main-Class 元素描述了 主类的信息
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: pc
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_92
Main-Class: com.mycompany.app.App
1
Manifest-Version: 1.0
2
Archiver-Version: Plexus Archiver
3
Built-By: pc
4
Created-By: Apache Maven 3.3.9
5
Build-Jdk: 1.8.0_92
6
Main-Class: com.mycompany.app.App
分别执行这两个 :
java -jar my-app-1.0-SNAPSHOT.jar
Hello World!
java -jar original-my-app-1.0-SNAPSHOT.jar
original-my-app-1.0-SNAPSHOT.jar中没有主清单属性
1
java -jar my-app-1.0-SNAPSHOT.jar
2
Hello World!
3
4
java -jar original-my-app-1.0-SNAPSHOT.jar
5
original-my-app-1.0-SNAPSHOT.jar中没有主清单属性
源码
https://github.com/apache/maven.git
官方文档
https://maven.apache.org/guides/getting-started/index.html
mvn clean 清理之前生成的
mvn instal : 会执行 compile , package , test 等
一般用 mvn clean install
IntelliJ IDEA创建 maven多模块 项目
https://www.cnblogs.com/wangmingshun/p/6383576.html
第三方资料
maven 的 pom.xml 文件详解 , 各个元素的手册
https://www.cnblogs.com/hafiz/p/5360195.html
pom.xml 里的parent标签,依赖包的配置文件的继承关系
Maven 依赖包的Snapshot版本和Release版本的区别
1. Snapshot版本代表不稳定、尚处于开发中的版本
2. Release版本则代表稳定的版本
以下是相关的知识点:
3. 什么情况下该用SNAPSHOT?
协同开发时,如果A依赖构件B,由于B会更新,B应该使用SNAPSHOT来标识自己。这种做法的必要性可以反证如下:
3.1 如果B不用SNAPSHOT,而是每次更新后都使用一个稳定的版本,那版本号就会升得太快,每天一升甚至每个小时一升,这就是对版本号的滥用。
3.2 如果B不用SNAPSHOT,但一直使用一个单一的Release版本号,那当B更新后,A可能并不会接受到更新。因为A所使用的repository一般不会频繁更新release版本的缓存(即本地repository),所以B以不换版本号的方式更新后,A在拿B时发现本地已有这个版本,就不会去远程Repository下载最新的B
4. 不用Release版本,在所有地方都用SNAPSHOT版本行不行?
不行。正式环境中不得使用snapshot版本的库。 比如说,今天你依赖某个snapshot版本的第三方库成功构建了自己的应用,明天再构建时可能就会失败,因为今晚第三方可能已经更新了它的snapshot库。你再次构建时,Maven会去远程repository下载snapshot的最新版本,你构建时用的库就是新的jar文件了,这时正确性就很难保证了。
IntelliJ 15 配置Maven,右下角最后三行:
Maven 软件的目录,
用户自定义的Maven 软件的配置文件,
本地仓库
Tomcat 7 和 9都开不起来,似乎软件没问题,是加载各种包的时候出错,
分析:
Maven 本地仓库坏了,清空掉,重新下载一次
先把镜像配置到Maven 软件的特定格式的配置文件里,H:SoftwareMavensettings.xml
然后把它跟eclipse 关联一下:
配置后更新一下项目,
这个URL已经被替换成镜像了,repo2
原来默认的URL是repo,国外的,很慢
下载并保存到本地的 Maven 仓库
本地的 Maven 仓库路径默认为 ${user.home}/.m2/repository(可以在setting.xml里添加标签后改掉),例如我电脑上的:
C:UsersXiaoCong.m2
epository
所以,commons-io 2.5 包所在的完整的绝对路径:
C:UsersXiaoCong.m2
epositorycommons-iocommons-io2.5commons-io-2.5.jar
我自己改了 repository仓库的位置:
H:SoftwarelibMaven
E:
epository
问题
下载插件很慢 / 手动通过浏览器下载,离线安装
{
解决方法参考
实践
去 maven 仓库搜索想要的插件或者依赖包
http://mvnrepository.com/artifact/org.apache.maven.plugins/maven-deploy-plugin/2.8.2
下载 jar 文件, 下载下来的压缩包里的是 .class 文件
我不需要源码的压缩包文件
下载链接 :
或者
放到本地的仓库文件夹里
E:
epositoryorgapachemavenpluginsmaven-deploy-plugin2.8.2
红色的是仓库的路径
后面的路径根据压缩包里的路径来 , 没有该文件夹就手动创建
}
"有个插件能开启内嵌的 Tomcat " 是什么意思
怎么生成标准结构
手动
Gradle 可以自动
生成 test 目录
本地仓库
放到 settings 标签下
注意路径中斜杠的方向
<!-- 本地仓库的存储位置, Default: ~/.m2/repository-->
<localRepository>D:MVNRepository</localRepository>
Maven 国内镜像
############################################
<!-- 写在 settings 下的 profiles 下 -->
<!-- 设定主仓库,按设定顺序进行查找 -->
<repositories>
<repository>
<id>aliyun</id>
<name>aliyun Repository</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>jeecg</id>
<name>jeecg Repository</name>
<url>http://maven.jeecg.org/nexus/content/repositories/jeecg</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>jeecg-snapshots</id>
<name>jeecg-snapshots Repository</name>
<url>http://maven.jeecg.org/nexus/content/repositories/snapshots</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
x
1
2
3
4
<!-- 写在 settings 下的 profiles 下 -->
5
6
<!-- 设定主仓库,按设定顺序进行查找 -->
7
<repositories>
8
<repository>
9
<id>aliyun</id>
10
<name>aliyun Repository</name>
11
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
12
<snapshots>
13
<enabled>false</enabled>
14
</snapshots>
15
</repository>
16
17
<repository>
18
<id>jeecg</id>
19
<name>jeecg Repository</name>
20
<url>http://maven.jeecg.org/nexus/content/repositories/jeecg</url>
21
<snapshots>
22
<enabled>false</enabled>
23
</snapshots>
24
</repository>
25
26
<repository>
27
<id>jeecg-snapshots</id>
28
<name>jeecg-snapshots Repository</name>
29
<url>http://maven.jeecg.org/nexus/content/repositories/snapshots</url>
30
<snapshots>
31
<enabled>true</enabled>
32
</snapshots>
33
</repository>
34
35
</repositories>
<!-- https://my.oschina.net/fdblog/blog/546938 -->
<!-- aliyun -->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<!-- net-cn -->
<mirror>
<id>net-cn</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://maven.net.cn/content/groups/public/</url>
</mirror>
<!-- UK -->
<mirror>
<id>uk</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://uk.maven.org/maven2/</url>
</mirror>
<!-- ibiblio -->
<mirror>
<id>ibiblio</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://mirrors.ibiblio.org/pub/mirrors/maven2/</url>
</mirror>
<!-- jboss -->
<mirror>
<id>jboss-public-repository-group</id>
<mirrorOf>central</mirrorOf>
<name>JBoss Public Repository Group</name>
<url>http://repository.jboss.org/nexus/content/groups/public</url>
</mirror>
<!-- repo2 -->
<mirror>
<id>repo2</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://repo2.maven.org/maven2/</url>
</mirror>
<!-- OSC -->
<mirror>
<id>CN</id>
<name>OSChina Central</name>
<url>http://maven.oschina.net/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>