Maven








写在 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:\Maven\pure-maven-plugin\target\pure-maven-plugin-1.0-SNAPSHOT.jar to F:\repository\pure\sample\plugin\pure-maven-plugin\1.0-SNAPSHOT\pure-maven-plugin-1.0-SNAPSHOT.jar

pom.xml 路径
[INFO] Installing E:\Maven\pure-maven-plugin\pom.xml to F:\repository\pure\sample\plugin\pure-maven-plugin\1.0-SNAPSHOT\pure-maven-plugin-1.0-SNAPSHOT.pom

因为配置 :

\pure\sample\plugin\pure-maven-plugin\1.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>

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 "="...

应该写
mvn package -Dmaven.test.skip=true -Ptest

结果 :
[INFO] --- pure-maven-plugin:1.0-SNAPSHOT:sayhi (default) @ my-app ---
[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>


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:\Maven\A\blockchain-part1
打开的是 A 文件夹



idea 里面
双击右侧的 Maven 面板的 compile 按钮 :
"C:\Program Files\Java\jdk1.8.0_92\bin\java" -Dmaven.multiModuleProjectDirectory=E:\Maven\A\blockchain-part1 "-Dmaven.home=D:\Program Files\JetBrains\IntelliJ IDEA 2017.2.6\plugins\maven\lib\maven3" "-Dclassworlds.conf=D:\Program Files\JetBrains\IntelliJ IDEA 2017.2.6\plugins\maven\lib\maven3\bin\m2.conf" "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2017.2.6\lib\idea_rt.jar=51248:D:\Program Files\JetBrains\IntelliJ IDEA 2017.2.6\bin" -Dfile.encoding=UTF-8 -classpath "D:\Program Files\JetBrains\IntelliJ IDEA 2017.2.6\plugins\maven\lib\maven3\boot\plexus-classworlds-2.5.2.jar" org.codehaus.classworlds.Launcher -Didea.version=2017.2.6 -s F:\repository\settings.xml -Dmaven.repo.local=F:\repository compile

格式化 :
"C:\Program Files\Java\jdk1.8.0_92\bin\java"
-Dmaven.multiModuleProjectDirectory=E:\Maven\A\blockchain-part1
"-Dmaven.home=D:\Program Files\JetBrains\IntelliJ IDEA 2017.2.6\plugins\maven\lib\maven3" 
"-Dclassworlds.conf=D:\Program Files\JetBrains\IntelliJ IDEA 2017.2.6\plugins\maven\lib\maven3\bin\m2.conf"
 "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2017.2.6\lib\idea_rt.jar=51248:D:\Program Files\JetBrains\IntelliJ IDEA 2017.2.6\bin" 
-Dfile.encoding=UTF-8 
-classpath "D:\Program Files\JetBrains\IntelliJ IDEA 2017.2.6\plugins\maven\lib\maven3\boot\plexus-classworlds-2.5.2.jar" org.codehaus.classworlds.Launcher 
-Didea.version=2017.2.6 -s F:\repository\settings.xml 
-Dmaven.repo.local=F:\repository 
compile

有的行
一点引号都不加 -Dfile.encoding=UTF-8  和  -Dmaven.repo.local=F:\repository 
最左边和最右边  "-Dmaven.home=D:\Program Files\JetBrains\IntelliJ IDEA 2017.2.6\plugins\maven\lib\maven3" 
只要右边加  -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:该目录存放测试使用的资源文件。

要先配置阿里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中没有主清单属性
分析 :
清单缺少个元素来指定 主类 / 入口类

解决方法 :
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>


加了插件后 , 打包出两个 jar :  
my-app-1.0-SNAPSHOT 和 original-my-app-1.0-SNAPSHOT

E:\Maven\my-app\target 下的 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

分别执行这两个 :

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中没有主清单属性



源码


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:\Software\Maven\settings.xml
然后把它跟eclipse 关联一下:

配置后更新一下项目,
 

这个URL已经被替换成镜像了,repo2
原来默认的URL是repo,国外的,很慢
 
下载并保存到本地的 Maven 仓库
本地的 Maven 仓库路径默认为  ${user.home}/.m2/repository(可以在setting.xml里添加标签后改掉),例如我电脑上的:
C:\Users\XiaoCong\.m2\repository\

所以,commons-io 2.5 包所在的完整的绝对路径:
C:\Users\XiaoCong\.m2\repository\commons-io\commons-io\2.5\commons-io-2.5.jar

我自己改了 repository仓库的位置:
H:\Software\lib\Maven
E:\repository


问题



下载插件很慢 / 手动通过浏览器下载,离线安装

{
解决方法参考

实践
去 maven 仓库搜索想要的插件或者依赖包
http://mvnrepository.com/artifact/org.apache.maven.plugins/maven-deploy-plugin/2.8.2

下载 jar 文件, 下载下来的压缩包里的是 .class 文件
不需要源码的压缩包文件

下载链接 :

或者

放到本地的仓库文件夹里
E:\repository\org\apache\maven\plugins\maven-deploy-plugin\2.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>



      <!-- 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>




posted on 2017-03-09 14:57  xiaoCong2015  阅读(1163)  评论(0编辑  收藏  举报

导航