Maven-01

先看看开发环境:

我们在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 claen install,构建结束后target目录下可以看到两个jar文件:

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

时间: 2024-08-04 10:18:20

Maven-01的相关文章

maven(一)下载,安装和配置

01.maven的简介 maven主要服务于基于java平台的项目构建,依赖管理和项目信息管理. 构建:它是一个非常强大的自动化构建工具,从清理,编译,测试到生成报告,再到打包和部署. 依赖管理和项目信息管理:我们所需的开源类库只需通过中央仓库找到,引入经纬,给每个类库定位了坐标,maven就能够帮我们自动下载,maven对于项目目录结构等内容都有既定的规则(约定大于配置). 02.maven的安装和配置 在windows上安装maven: *检查jdk安装 *下载maven(https://m

Maven学习三 使用junit测试maven project

每个开发人员都会对自己的代码进行自定义的测试,可以是把项目run起来,手动点点页面按钮,看看操作场景和步骤点是否符合业务需要,是否存在UE上的问题.也有自己写几个测试类,把service类的输入输出是否符合标准都测试一番,这两大类,其实就是包括了前后端的测试工作,分工各有不同.在maven中集成了junit测试包,应该说maven可以集成任何你想的到或者想不到工具插件. 在maven project-01项目中引入junit插件并不困难,只需要在pom.xml中配置好依赖包即可(IDE环境下,依

我喜欢减肥我们来减肥吧

http://www.ebay.com/cln/honus.jyw4mvptb/cars/158313278016/2015.01.28.html http://www.ebay.com/cln/honus.jyw4mvptb/cars/158313282016/2015.01.28.html http://www.ebay.com/cln/honus.jyw4mvptb/cars/158313289016/2015.01.28.html http://www.ebay.com/cln/usli

百度回家看沙发沙发是减肥了卡斯加积分卡拉是减肥

http://www.ebay.com/cln/hpryu-caw8ke/cars/158056866019/2015.01.31 http://www.ebay.com/cln/xub.50x2l7cj/cars/158445650015/2015.01.31 http://www.ebay.com/cln/xub.50x2l7cj/cars/158445674015/2015.01.31 http://www.ebay.com/cln/xub.50x2l7cj/cars/1584456790

巢哑偕倥乇椭煞谙暗逞帕俸

IEEE Spectrum 杂志发布了一年一度的编程语言排行榜,这也是他们发布的第四届编程语言 Top 榜. 据介绍,IEEE Spectrum 的排序是来自 10 个重要线上数据源的综合,例如 Stack Overflow.Twitter.Reddit.IEEE Xplore.GitHub.CareerBuilder 等,对 48 种语言进行排行. 与其他排行榜不同的是,IEEE Spectrum 可以让读者自己选择参数组合时的权重,得到不同的排序结果.考虑到典型的 Spectrum 读者需求

我国第三代移动通信研究开发进展-尤肖虎200106

众所周知,数据科学是这几年才火起来的概念,而应运而生的数据科学家(data scientist)明显缺乏清晰的录取标准和工作内容.此次课程以<星际争霸II>回放文件分析为例,集中在IBM Cloud相关数据分析服务的应用.面对星际游戏爱好者希望提升技能的要求,我们使用IBM Data Science Experience中的jJupyter Notebooks来实现数据的可视化以及对数据进行深度分析,并最终存储到IBM Cloudant中.这是个介绍+动手实践的教程,参会者不仅将和讲师一起在线

pl/sql学习1——标量变量psahnh6S

为类型.不能用于表列的数据类型.范围为的子类型.自然数.为的子类型.具有约束为单精度浮点数.为变量赋值时.后面要加为双精度浮点数.为变量赋值时.后面要加.为数字总位数.为小数位数是的子类型.最大精度位是的子类型.最大精度位单精度浮点型是的子类型.最大精度位双精度浮点型定义精度为位的实数..定义为位的整数.变长字符串.最长测试变量数据!.定长字符串.最长测试变长二进制字符串物理存储的为类型...固定长度.个字节使用定义数据类型那个最小值:最大值:最小值:最大值:最小值:最大值:最小值:最大值:最小

Rhythmk 学习 Hibernate 01 - maven 创建Hibernate 项目之 增删改查入门

1.环境: Maven :3.1.1 开发工具:Spring Tool Suite 数据库 : Mysql  5.6 2.项目文件结构 文件代码: 2.1 .pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.ap

01淘淘商城项目:项目Maven工程搭建

最近在学习淘淘商城项目的搭建,使用maven做管理 后台管理系统工程搭建: 使用maven的好处: 1.依赖管理.jar包.工程之间依赖 2.项目构建:实现项目的一步构建 3.工程聚合.继承.依赖 maven工程分为三种类型: pom工程:用在父级工程,聚合工程中 war包工程:主要用作网站 jar包工程:就是当作jar使用的,可以用来打包 先给出总的项目结构,然后再解释是如何实现这些结构的 解释如下: 1.taotao-parent taotao-parent公司级别的maven工程.主要功能

开发系列:01、使用Java和Maven开发Spark应用

1.POM.xml 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">