发表于: 2018-03-10 20:35:46
1 630
一、今天学习的内容
1.完成昨天剩下的内容 √
2.完成archetype的学习 √
3. 熟悉idea √
4. 用idea创建maven项目,并深入学习聚合等概念 ×
具体的总结如下:
【知识点】插件
Maven的核心仅仅定义了抽象的生命周期,而插件是用来执行实际的构件任务的。
什么是插件
Maven是一个一系列Maven Plugins(Maven 插件)的核心架构。
换句话说,插件就是那些实际执行的动作,插件可以用来创建jar文件,创建war文件,编译代码,单元测试,创建项目文档,等等,几乎任何项目中你能想到的动作都是maven插件实现的。这个文件夹下面吗?
插件是Maven的核心功能,允许在多个项目中重用通用构建逻辑。 他们通过项目对象模型(POM)执行“动作”(比如创建WAR文件或编译单元测试)来完成此操作。 插件行为可以通过一组独特的参数来定制,这些参数通过每个插件命令(或者Mojo)的描述公开。
其中最简单的插件是Clean Plugin,maven-clean-plugin的工作是一处Maven 项目的目标文件夹。当你运行mvn clean
Maven
执行定义在Clean插件的clean
命令,target文件夹就被删除了,Clean插件亦可以通过定义参数来定制插件的行为。outputDrectory就是这个参数,它默认的是$
(项目创建所在文件夹)
【疑】我发现插件的文件夹在本地仓库文件夹下面的org/apache/maven/plugins
这里就是执行命令的地方,如果我想自定义插件的话,也应该移到这个文件夹下面吗?还有一个有些小不懂得就是,之前我们用install命令讲我们自己所写的类,安装到了本地仓库,那个jar包应该不算插件吧,因为他没有执行命令,只是提供这样一个功能共享而已吧?希望我理解的没错。
什么是Mojo
Mojo就是在Maven中的一个命令(goal),插件有一些命令组成,Mojos能被定义为注释类或者Beanshell脚本,一个Mojo描述了一个命令的元数据:命令的名字 它所适应的生命周期 他的参数。
内置绑定
Maven在和行为一些主要的生命周期阶段绑定了很多插件的命令(goal),当用户通过命令行调用声明后期阶段的时候,对应的插件命令(goal)就会执行相应的任务,也就是说如果要想让这个插件执行一些命令的话,就必须先绑定生命周期,Maven里面还有一些没有绑定的,就什么工作都干不了,这就需要了人工绑定。
自定义绑定
一个例子:如果我要创建项目的源码jar包,我们已经知道maven-source-plugin可以执行jar-no-fork命令,但是没有绑定生命周期,我们现在用不了,所以如何绑定到default生命周期的verify上面呢??
【注】下面的这些我不太理解,只是加上自己的理解。因为我没有找到那个插件,不知道是先下载下来,还是说怎么回事。
进入本地仓库的`org/apache/maven/plugins/maven-source-plugin修改Pom文件。
如下:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.2</verison>
<executions>
<execution>
<id>attach-sources</id>
<phase>verrigy</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins></build>
注意phase参数,把它放在了verify的阶段,输入mvn verify就会成功完成这个任务了。当然如果将这个phase删除,再次执行mvn verify还是会成功,这是因为在很多插件的目标在编写时他们就已经定义了默认绑定阶段,可以使用maven-help-plugin
查看插件详细信息。
输入mvn help:describe-Dplugin=org.apache.maven.plugins:maven-sourse-plugin:2.1.1-Ddetail
插件的配置
完成了插件和生命周期的绑定之后,我们还可以配置插件goal的参数,进一步调整插件目标所执行的任务,以满足项目的需要。
- 命令行插件配置
用户可以在Maven命令中使用-D参数,并用=配置参数,如:
maven-surefire-plugin提供了一个maven.test.skip参数,它值为true的时候,就会跳过执行测试,于是在运行命令的时候,输入如下命令就能跳过测试。mvn install-Dmaven.test.skip=true
- Pom中全局配置
并不是所有的插件参数都适合从命令行配置,有些参数的值从项目创建到发布都不会改变,或很少改变,对于这种情况,在pom中一次性配置显然更方便。如:我们通常会需要配置maven-compiler-plugin告诉它变异Java1,5版本的源文件,生成与JVM。5兼容的字节码文件,所以在它的pom中这么配置:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.1</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configurtion>
</plugin>
</plugins></build>
所以说Pom是Maven的核心,插件的配置都在里面在<build>参数下面,通过<configuration>可以配置参数值,通过executions下的execution可以配置命令(goal)。当然一个插件可以配置多个命令,从他的复数状态就可以看出。
配置maven-shade-plugin
使它能够生成可执行jar文件。
在pom中修改如下:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.2.1</verison>
<executions>
<execution>
<phase>paxkage</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation = "org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.mycom.app.helloworld.HelloWorld</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins></build>
【注】我之前理解错误,我一直以为修改插件,配置插件,必须得在本地仓库中配置,然而不是这样的,是在你用到的项目中的POM修改,它会下载你所要用到的插件,换一种方式去理解,插件是别人提供给你的功能,如果你直接修改插件的话,那其他人要用这个插件怎么办?要修改的只需要在本项目中修改就好,不要修改原本的插件。
现在运行mvn clean install
就能生成可执行的jar包了,打开这个包看一下里面的MANIFEST.MF 就会发现最后一行多了这个:
现在在项目的根目录下输入:java-jar target \hello-world-1.0-SNAPSHOT.jar
就会输出了:
dreamer@dreamer-Aspire-VN7-591G:~/workspace/hello-world$ java -jar target/hello-world-1.0-SNAPSHOT.jar
Hello World
正是我们所需要的。
六、使用Archetype生成项目骨架
什么是项目骨架?
项目骨架就是我们这个项目的结构,下面的图就是刚才HelloWorld的项目骨架:
.
├── pom.xml├── src
│ ├── main
│ │ └── java
│ │ └── com
│ │ └── mycom
│ │ └── app
│ │ └── hello-world
│ │ └── HelloWorld.java│ └── test
│ └── java
│ └── HelloWorldTest.java└── target
├── classes
│ └── com
│ └── mycom
│ └── app
│ └── helloworld
│ └── HelloWorld.class
├── hello-world-1.0-SNAPSHOT.jar
├── maven-archiver
│ └── pom.properties
├── maven-status
│ └── maven-compiler-plugin
│ ├── compile
│ │ └── default-compile
│ │ ├── createdFiles.lst
│ │ └── inputFiles.lst
│ └── testCompile
│ └── default-testCompile
│ ├── createdFiles.lst
│ └── inputFiles.lst
├── original-hello-world-1.0-SNAPSHOT.jar
├── surefire-reports
│ ├── com.mycom.app.helloworld.HelloWorldTest.txt
│ └── TEST-com.mycom.app.helloworld.HelloWorldTest.xml
└── test-classes
└── com
└── mycom
└── app
└── helloworld
└── HelloWorldTest.class28 directories, 14 files
想一下,我们怎么做的,先创建src/main/java
z再创建src/test/java...
难不成每次项目都要建这么一大堆东西吗?fuck!!
Maven提供了Archetype来帮助我们快速勾勒出项目的骨架!!
在maven3中,简单的运行mvn archetype:generate
就可以轻松解决!!
当然这个也算是一个命令,所以我们实际上是在运行插件maven-archetype-plugin,generate是插件的目标。
快来试一下:
下面我们创建一个HelloMaven的项目。
执行mvn archetype:generate
第一次运行它他会下载各种各样的构件,紧接着它输出:
2096: remote -> uk.ac.rdg.resc:edal-ncwms-based-webapp (-)2097: remote -> uk.co.nemstix:basic-javaee7-archetype (A basic Java EE7 Maven archetype)2098: remote -> uk.co.solong:angular-spring-archetype (So Long archetype for RESTful spring services with an AngularJS frontend. Includes debian deployment)2099: remote -> us.fatehi:schemacrawler-archetype-maven-project (-)2100: remote -> us.fatehi:schemacrawler-archetype-plugin-command (-)2101: remote -> us.fatehi:schemacrawler-archetype-plugin-dbconnector (-)2102: remote -> us.fatehi:schemacrawler-archetype-plugin-lint (-)2103: remote -> xyz.luan.generator:xyz-generator (-)
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 1147://在这里吓坏我,往上面一翻有2103个选择,,该选择哪个数字呢?暂时还不知道,那就默认的吧是1147,直接回车
Choose org.apache.maven.archetypes:maven-archetype-quickstart version:
1: 1.0-alpha-12: 1.0-alpha-23: 1.0-alpha-34: 1.0-alpha-45: 1.06: 1.1Choose a number: 6: //按默认的来,直接回车。...
...//中间下载了一些东西Define value for property 'groupId': com.mycom.appDefine value for property 'artifactId': hello-maven
Define value for property 'version' 1.0-SNAPSHOT: : //直接回车或者是设置版本Define value for property 'package' com.mycom.app: ://这个是项目默认的jar包名,直接回车。 Confirm properties configuration:
groupId: com.mycom.appartifactId: hello-maven
version: 1.0-SNAPSHOT
package: com.mycom.app
Y: : Y
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.1[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: basedir, Value: /home/dreamer/workspace
[INFO] Parameter: package, Value: com.mycom.app[INFO] Parameter: groupId, Value: com.mycom.app[INFO] Parameter: artifactId, Value: hello-maven
[INFO] Parameter: packageName, Value: com.mycom.app[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: /home/dreamer/workspace/hello-maven
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS//构建成功[INFO] ------------------------------------------------------------------------
[INFO] Total time: 02:09 min
[INFO] Finished at: 2018-03-10T16:46:33+08:00[INFO] Final Memory: 18M/203M
[INFO] ------------------------------------------------------------------------
【疑】在之前我们自己建的时候,jar包的名字有一个流程的,还要加上version版本,为何在这里利用archetype建立的默认不是含有version的呢?
现在我们就有hello-maven的项目了
看一下骨架。。。
├── pom.xml└── src
├── main
│ └── java
│ └── com
│ └── mycom
│ └── app
│ └── App.java
└── test
└── java
└── com
└── mycom
└── app
└── AppTest.java
是不是省了很多工作呢?
到此,简单的HelloWorld项目就完成了,呼累死,也学到了很多。
参考文献
maven官方文档
maven实战,许晓斌,2017.3
各类文章,谢谢各位前辈
二、明天要做的事情
1. 用idea创建maven项目
2. 学习Dao
3. 学习JDBC(这条争取,不一定有时间)
评论