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 阅读(199) 评论(0) 编辑 收藏 举报