Maven-01: Maven入门

先看看开发环境:

我们在E盘下新建一个文件夹叫helloworld,这个文件夹下建一个src文件夹和一个文件pom.xml。

src下的目录结构为:

pom.xml文件内容为:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 4     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
 5 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 6   <modelVersion>4.0.0</modelVersion>
 7   <groupId>com.juvenxu.mvnbook</groupId>
 8   <artifactId>helloworld</artifactId>
 9   <version>0.0.1-SNAPSHOT</version>
10   <name>Maven Hello World Project</name>
11 </project>

我们写一个Java类HelloWorld.java,路径为:E:\helloworld\src\main\java\com\juvenxu\mvnbook\helloworld。

 1 package com.juvenxu.mvnbook.helloworld;
 2 
 3 public class HelloWorld{
 4     
 5     public static void main(String[] args){
 6         System.out.println(new HelloWorld().sayHello());
 7     }
 8     
 9     public String sayHello(){
10         return "Hello Maven";
11     }
12 }

下面我们使用Maven进行编译,我们cd到项目根目录下运行mvn clean compile:

截图省略了一些下载的内容。完成后项目根目录下多了一个target文件夹:

clean是告诉Maven清理输出目录target,compile告诉Maven编译项目主代码。默认情况下,Maven构建的所有输出都在target目录中。

下面写一个测试类HelloWorldTest.java,路径为:E:\helloworld\src\test\java\com\juvenxu\mvnbook\helloworld:

 1 package com.juvenxu.mvnbook.helloworld;
 2 
 3 import org.junit.Test;
 4 import static org.junit.Assert.assertEquals;
 5 
 6 public class HelloWorldTest{
 7     
 8     @Test
 9     public void testSayHello(){
10         HelloWorld helloworld = new HelloWorld();
11         String result = helloworld.sayHello();
12         assertEquals("Hello Maven",result);
13     }
14 }

因为代码中用到了JUnit框架,所以我们修改pom.xml:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 4     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
 5 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 6   <modelVersion>4.0.0</modelVersion>
 7   <groupId>com.juvenxu.mvnbook</groupId>
 8   <artifactId>helloworld</artifactId>
 9   <version>0.0.1-SNAPSHOT</version>
10   <name>Maven Hello World Project</name>
11   
12   <dependencies>
13     <dependency>
14         <groupId>junit</groupId>
15         <artifactId>junit</artifactId>
16         <version>4.7</version>
17         <scope>test</scope>
18     </dependency
19   </dependencies>
20 </project>

scope元素表示依赖范围,值为test表示该依赖只对测试有效,即测试代码中含有Juint的类方法注解是没有问题的,但是主代码中就不可以,会造成编译错误。如果不声明依赖范围,那么默认值就是compile,表示该依赖对主代码和测试代码都有效。

下面我们在项目根目录下执行命令:mvn clean test:

此时target目录下多出了两个文件夹:

将项目进行编译测试之后,下一个步骤就是打包。helloworld的pom中没有指定打包类型,那么默认使用打包类型jar。我们在项目根目录下执行mvn clean package:

此时target目录下多出了一个jar文件和一个文件夹:

jar文件的命名规则是artifact-version.jar。当然如果有需要,还可以使用finalName来自定义该文件的名称,我们修改pom.xml:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 4     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
 5 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 6   <modelVersion>4.0.0</modelVersion>
 7   <groupId>com.juvenxu.mvnbook</groupId>
 8   <artifactId>helloworld</artifactId>
 9   <version>0.0.1-SNAPSHOT</version>
10   <name>Maven Hello World Project</name>
11   
12   
13   <dependencies>
14     <dependency>
15         <groupId>junit</groupId>
16         <artifactId>junit</artifactId>
17         <version>4.7</version>
18         <scope>test</scope>
19     </dependency>
20   </dependencies>
21   
22   <build>
23       <finalName>custom-helloworld</finalName>
24   </build>
25 </project>

然后再次运行命令mvn clean package,在target目录下我们看到文件。

至此,我们得到了项目的输出,如果有需要的话,可以复制这个jar到其他项目的Classpath中从而使用HelloWorld类。但是如何才能让其他的Maven项目直接引用这个jar呢?我们可以使用安装命令mvn clean install:

maven-metadata-local.xml:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <metadata>
 3   <groupId>com.juvenxu.mvnbook</groupId>
 4   <artifactId>helloworld</artifactId>
 5   <versioning>
 6     <versions>
 7       <version>0.0.1-SNAPSHOT</version>
 8     </versions>
 9     <lastUpdated>20151107164215</lastUpdated>
10   </versioning>
11 </metadata>

_remote.repositories:

1 #NOTE: This is an Aether internal implementation file, its format can be changed without prior notice.
2 #Sun Nov 08 00:42:15 CST 2015
3 helloworld-0.0.1-SNAPSHOT.pom>=
4 helloworld-0.0.1-SNAPSHOT.jar>=

helloworld-0.0.1-SNAPSHOT.pom是一个文本文件,和项目的pom.xml完全相同。

maven-metadata-local.xml:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <metadata modelVersion="1.1.0">
 3   <groupId>com.juvenxu.mvnbook</groupId>
 4   <artifactId>helloworld</artifactId>
 5   <version>0.0.1-SNAPSHOT</version>
 6   <versioning>
 7     <snapshot>
 8       <localCopy>true</localCopy>
 9     </snapshot>
10     <lastUpdated>20151107164215</lastUpdated>
11     <snapshotVersions>
12       <snapshotVersion>
13         <extension>jar</extension>
14         <value>0.0.1-SNAPSHOT</value>
15         <updated>20151107164215</updated>
16       </snapshotVersion>
17       <snapshotVersion>
18         <extension>pom</extension>
19         <value>0.0.1-SNAPSHOT</value>
20         <updated>20151107164215</updated>
21       </snapshotVersion>
22     </snapshotVersions>
23   </versioning>
24 </metadata>

我们的主代码HelloWorld.java是一个含有main方法的类,但是默认打包生成的jar是不能够直接运行的,因为带有main方法的类信息不会添加到manifest中。我们打开custom-helloworld.jar/META-INF/MANIFEST.MF:

可以看到没有Main-Class一行。

为了生成可执行的jar文件,需要借助maven-shade-plugin插件,我们修改pom.xml:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 4     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
 5 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 6   <modelVersion>4.0.0</modelVersion>
 7   <groupId>com.juvenxu.mvnbook</groupId>
 8   <artifactId>helloworld</artifactId>
 9   <version>0.0.1-SNAPSHOT</version>
10   <name>Maven Hello World Project</name>
11   
12   
13   <dependencies>
14     <dependency>
15         <groupId>junit</groupId>
16         <artifactId>junit</artifactId>
17         <version>4.7</version>
18         <scope>test</scope>
19     </dependency>
20   </dependencies>
21   
22   <build>
23     <plugins>
24         <plugin>
25             <groupId>org.apache.maven.plugins</groupId>
26             <artifactId>maven-shade-plugin</artifactId>
27             <version>1.2.1</version>
28             <executions>
29                 <execution>
30                     <phase>package</phase>
31                     <goals>
32                         <goal>shade</goal>
33                     </goals>
34                     <configuration>
35                         <transformers>
36                             <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
37                                 <mainClass>com.juvenxu.mvnbook.helloworld.HelloWorld</mainClass>
38                             </transformer>
39                         </transformers>
40                     </configuration>
41                 </execution>
42             </executions>
43         </plugin>
44     </plugins>
45   </build>
46 </project>

再次执行mvn clean install,构建结束后target目录下可以看到两个jar文件:

第一个jar是带有Main-Class信息的可运行jar。我们打开helloworld-0.0.1-SNAPSHOT.jar/META-INF/MANIFEST.MF:

 

posted on 2015-11-08 01:39  confirmCname  阅读(198)  评论(0编辑  收藏  举报

导航