Maven实战01—使用入门 我之前在知乎写了关于maven的教程,但是现在的我看来,内容过于浅显,甚至只讲了大概。现在开始连载一下maven的知识点。会比上次更加深入,不过对于大体的基础概念就不再重复了。所以我还是推荐你去看看我那篇不成熟的文章。传送门
安装与配置 在我曾经的知乎中有写到,本次教程mvn的编译打包统统都是用命令行完成。以下是maven项目的基础构造。对于maven来说约定大于配置。
尽量按照maven所要求的层级来开发,虽然maven也可以自定义,但是统一的风格会让项目有更好的可读性。总的来说就是src存放逻辑代码,src-main放实际代码,test中存放测试代码。src-resources代表静态资源。target代表着编译或者打包后的文件。pom文件就是依赖的文件。
1.编写POM文件 1 2 3 4 5 6 7 8 9 10 <?xml version="1.0" encoding="UTF-8"?> <project xmlns ="http://maven.apache.org/POM/4.0.0" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > <modelVersion > 4.0.0</modelVersion > <groupId > com.example</groupId > <artifactId > maven_demo</artifactId > <version > 1.0-SNAPSHOT</version > </project >
这就是一个最简单的pom文件
代码第一行是xml头,指定了文档的版本和编码方式。
代码第二行是project元素,它是所有pom的根元素,里面的属性声明了一些POM相关的命名空间和xsd元素。一般来说这些都是固定的,不需要修改。
<modelVersion>4.0.0</modelVersion>
这个标签指定了当前POM模型的版本,对于maven2及maven3来说,它只能是4.0.0 不过现在应该大部分都是maven3了吧。总之这个也不用我们管。
接下来就是三大巨头
1 2 3 4 <groupId > com.example</groupId > <artifactId > maven_demo</artifactId > <version > 1.0-SNAPSHOT</version > <name > 这是我的项目啦</name >
上述3个标签是我们所要关心,也是我们所要填写的。最后一个name是项目名称,倒不是必填的。groupId
定义了项目属于哪个租,这个组和所在的组织和公司关联。比如你的公司是example,那么这个就填com.example
。这个和Java包的命名规范是一样的,按照地址反向来写。org代表组织,edu代表教育机构等等,当然这肯定不会校验格式啥的,但最好还是按约定来,这样对大家都好。artifactId
定义了当前maven项目在组中唯一的ID,比如我的为maven_demo。你可以理解为example公司下的一个产品,这个公司会有很多产品,但是在公司中,artifactId
是唯一的。version
很简单,就是这个产品的版本,SNAPSHOT名为快照,说明该项目还处于开发中,是不稳定的版本。
2.编写主代码 1 2 3 4 5 6 7 8 9 10 11 12 package com.example.mvnbook;public class Helloworld { public String sayHello () { return "Hello Maven" ; } public static void main (String[] args) { System.out.println(new Helloworld().sayHello()); } }
项目主代码处于src的main中,项目的主代码最终会被打包到构建中(如jar),而测试代码(test文件中)只在运行测试时用到,不会被打包。我们按照maven的约定,创建目录,然后在该目录下创建文件com.example.mvnbook.Helloworld.java
,代码如上面显示。
3.编译项目 在该项目的目录下打开命令行输入mvn clean compile
你就会发现多了一个target的文件夹,里面有你代码的一些编译文件。clean命令执行的意思是清空target文件,compile是编译项目的意思。
4.编写测试代码 为了使项目结构保持清晰,主代码与测试代码应该分别位于独立的目录中。maven项目中默认的测试代码目录是/src/test/java。在编写测试用例之前,应当先创建该目录。
在Java中,Junit是事实上的单元测试标准,要使用JUnit,首先需要为项目添加一个依赖,修改项目的POM如下面代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <?xml version="1.0" encoding="UTF-8"?> <project xmlns ="http://maven.apache.org/POM/4.0.0" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > <modelVersion > 4.0.0</modelVersion > <groupId > com.example</groupId > <artifactId > maven_demo</artifactId > <version > 1.0-SNAPSHOT</version > <name > 这是我的项目啦</name > <dependencies > <dependency > <groupId > junit</groupId > <artifactId > junit</artifactId > <version > 4.7</version > <scope > test</scope > </dependency > </dependencies > </project >
上述POM代码中还有一个<scope>test</scope>
,这里的意思是在测试环境中,也就是test中使用该依赖没问题,但是不能在主代码中使用该依赖。
接着写测试类吧。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 package com.example.mvnbook;import static org.junit.Assert.assertEquals;import org.junit.Test;public class HelloworldTest { @Test public void testSayHello () { Helloworld helloworld = new Helloworld(); String result = helloworld.sayHello(); assertEquals("Hello Maven" ,result); } }
一个典型的单元测试包含三个步骤:1.准备测试类及数据;2.执行要测试的行为;3检查结果。上述代码初始化了需要测试的类,然后执行sayHello()
方法并保存到result变量中,最后使用JUnit的Assert类检查结构是否为我们期望的”Hello Maven”
测试类名要以被测试类名+Test命名,这里为HelloworldTest,测试方法要以test+被测试的方法名命名,这里为testSayHello,同时测试方法要加@Test注解。一定要按规范来,否则maven可能识别不到测试的方法
然后输入mvn test
就可以了,出现下面的代码就说明成功了。
1 2 3 4 5 6 7 8 9 ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.example.mvnbook.HelloworldTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.098 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
假如构建失败的话,可能你需要在maven中配置一下你的Java版本及其一些其他东西。
5.打包和运行 输入mvn clean package
就可以打包了,和上面的一样,这也是先执行了clean,然后执行了package。最后你就可以在target中看到属于自己的包了,POM中没有指定打什么包,默认就是打jar包。
如果你的文件与我不同也不要怀疑自己错了,执行成功target文件夹里面有jar即可。那么怎么运行呢?默认打包生成的jar是不能运行的,我们需要配置一个插件。重新打一个可以运行的jar包。重新修改POM文件,加入一个插件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 <?xml version="1.0" encoding="UTF-8"?> <project xmlns ="http://maven.apache.org/POM/4.0.0" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > <modelVersion > 4.0.0</modelVersion > <groupId > com.example</groupId > <artifactId > maven_demo</artifactId > <version > 1.0-SNAPSHOT</version > <name > 这是我的项目啦</name > <dependencies > <dependency > <groupId > junit</groupId > <artifactId > junit</artifactId > <version > 4.7</version > <scope > test</scope > </dependency > </dependencies > <build > <plugins > <plugin > <groupId > org.apache.maven.plugins</groupId > <artifactId > maven-shade-plugin</artifactId > <version > 2.0</version > <executions > <execution > <phase > package</phase > <goals > <goal > shade</goal > </goals > <configuration > <transformers > <transformer implementation ="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer" > <manifestEntries > <Main-Class > com.example.mvnbook.Helloworld</Main-Class > </manifestEntries > </transformer > </transformers > </configuration > </execution > </executions > </plugin > </plugins > </build > </project >
最后重新打包就行mvn clean package
然后在target下运行Java命令就行。
结语 立刻操作一下吧,光看是不行的哦。有啥问题可以评论!