Maven in action 笔记(1)

1.1  基本要素

在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。 

1.2 主要代码

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 自己的。 这个需要修正么


1.3 测试代码

默认测试代码是在 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


1.4 打包

默认是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

1.5 关于框架

关于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/ 源码可以下载

你可能感兴趣的:(Maven in action 笔记(1))