在maven 世界, 任何的jar pom war 都是基于这些基本的坐标来进行区分的。
groupId 定义属于哪个组, 比如 googlecode 上的myapp 的项目, 就是 com.googlecode.myapp
modelVersion, 指定了当前POM模型的版本, 对于 mvn2 3 来说就是 4.0.0。
groupId 定义属于哪个组, 比如 googlecode 上的myapp 的项目, 就是 com.googlecode.myapp
artifactId mvn项目在当前组唯一的ID,看来是不能空格吧 ? 如何定义呢。
现在做的这个叫做 hello-world。
version - 项目当前的版本。
name - 不是必须的 更为友好的项目名称。
所以即使没有实际的代码, 也可以定义Maven项目的POM。 好处是解耦, 就是最大程度减少代码和POM 之间的影响。 如果要升级版本只需要改POM, 而POM 稳定了, Java 代码开发也不需要修改POM。
maven 约定主代码在 src/main/java下面, 无需配置, maven 会自动搜索这些代码。 而包名呢则是com.hz.mvnbook.helloworld. 这样比较一致。
而在具体设置的时候呢, com.hz.mvnbook 是groupid , 然后 artifactId 是helloWorld;
好处是更加清晰, 更符合逻辑, 也易于搜索。
然后编译
命令: mvn clean compile
其实是做了两件事, 一个clean- 这个是清理目录target, 然后编译。 在cmd 下面执行了。 但是还不会用eclipse 来执行。 后面有介绍
验证结果
1)clean 执行clean:clean 删除了 target
- resources:resources 做啥
2) compieler:compiler 将项目主代码编译至target/classes
注意bin 下面是eclipse 自己的。 这个需要修正么
默认测试代码是在 src/test/java
首先POM 的JUnit 依赖。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
有了这段坐标, Maven 就会自动下载 junit-4.7 在中央仓库 http://repo1.maven.org/maven2/
注意 <scope>test</scope> 以为着只能在test代码中用, 这个含义是: 如果在主代码, 就会编译错误。 默认是compile, 就都可以用了。
对于测试代码, junit3 每个方法都要test 开头。 junit4 每个测试方法都@Test 进行标注。 我们也以test 开头。
执行
命令: mvn clean test
output 如下, 就是成功了,
[WARNING] File encoding has not been set, using platform encoding GBK, i.e. build is platform dependent! [INFO] Compiling 1 source file to c:\calixdeveloper\eclipseNew\workspacePersonal\helloworld\target\test-classes [INFO] [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ hello-world --- [INFO] Surefire report directory: c:\calixdeveloper\eclipseNew\workspacePersonal\helloworld\target\surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running test.java.com.hz.mvnbook.helloworld.HelloWorldTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.081 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 4.508 s [INFO] Finished at: 2015-05-11T14:18:58+08:00 [INFO] Final Memory: 9M/245M [INFO] ------------------------------------------------------------------------
遇到问题, 发现package 不对而已。
package test.java.com.hz.mvnbook.helloworld;
两个代码的package 都写错了。 eclipse 里面project 的src 的路径不对, 应该分别。
现在的问题, 如果改成了 com.hz.mvnbook.helloworld; 就是红叉。
关于结局:重启eclipse 好了。 所以只是更改project 里面的src 的路径就可以了。 good
默认是jar。 执行: mvn clean package
在target 下面有 hello-world-1.0-SNAPSHOT.jar
另外, 可以finalName 来自定义这个文件的名称。
那么如何让其他的项目引用这个jar 呢。
执行 mvn clean install
会发现本地方仓库会有这个东西。 try 果然在这里
C:\Users\xx\.m2\repository\com\hz\mvnbookd\hello-world\1.0-SNAPSHOT
然后估计别的项目只要制定这些groupid 之类就可以引用这个项目了。 集中式仓库?
综上, 我们已经
mvn clean compile
mvn clean test
mvn clean package
mvn clean install
基本上执行后面会自动带前面还有别的也 ^_^
但是我们没有运行这个项目, - 默认的jar 不能直接运行, 因为main方法的类信息不回添加到manifest 里面 可以try META-INF/MANIFEST.MF 文件, 无法看到 Main-Class
Q Manifest.mf 干嘛用的
目前这个文件
Manifest-Version: 1.0 Built-By: hzhang Build-Jdk: 1.6.0_27 Created-By: Apache Maven 3.2.3 Archiver-Version: Plexus Archiver
所以要添加这个在POM 里面, 注意main 函数的位置。
<build> <plugins> <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.hz.mvnbook.helloworld.HelloWorld</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build>
然后就可以执行 java -jar xxxx.jar 就没有问题了。
失败的
hzhang@NAN-HZHANG /C/calixdeveloper/eclipseNew/workspacePersonal/helloworld $ java -jar target/original-hello-world-1.0-SNAPSHOT.jar Failed to load Main-Class manifest attribute from target/original-hello-world-1.0-SNAPSHOT.jar
成功的
hzhang@NAN-HZHANG /C/calixdeveloper/eclipseNew/workspacePersonal/helloworld $ java -jar target/hello-world-1.0-SNAPSHOT.jar Hello Maven
关于test code,main code, pom, 等等, 这些骨架, 每次做估计会烦死人。 所以
- eclipse 有maven的工程, 或者这个; 果然只需要写arti id 就可以了
- 其实这个时候就是用 maven-archetype-quickstart 来创建的。
- 执行 $ mvn archetype:generate
注意maven 2 有问题即可。
要填写参数
Define value for property 'groupId': : com.juvenxu.mvnbook Define value for property 'artifactId': : hello-world [INFO] Using property: version = 1.0-SNAPSHOT Define value for property 'package': com.juvenxu.mvnbook: : 1.0-SNAMPSHOT
然后就可以了。 或者导入或者什么的。
然后$ mvn eclipse:eclipse 来产生eclipse prjcect
1.6 关于m2eclipse
- 首先要安装这个在eclipse, 这个我已经安装了。
然后导入import 时候选择 maven project 。
TOTEST
- 关于mavn 项目创建, 同1.5 非常方便。
注意 关于执行, 如果没有想用的命令, 可以run maven build。
然后呢 在goals 输入 clean test
就可以做 mvn clean test 了。 非常好。
下一步
1 第三章开始 坐标等 生命周期
2 构建web 应用
3 其他
参考
1 maven 实战 作者的博客 http://www.juvenxu.com/mvn-in-action/ 源码可以下载