这里以普通的Java工程为例,介绍创建运行项目、配置项目、添加依赖库、配置日志、进行单元测试、打包。
创建运行项目
最简单的方式是:mvn archetype:create -DgroupId=net.coderbee -DartifactId=javaproject
这个命令执行完后会在当前目录下创建一个名为javaproject
的目录,里面的目录结构是这样的:
|---pom.xml |---src | |---main | | |---java | | | |---net | | | | |---coderbee | | | | | |---App.java | |---test | | |---java | | | |---net | | | | |---coderbee | | | | | |---AppTest.java
进入javaproject
目录执行mvn package
命令,Maven会进行编译、打包,默认是jar包,命令完成后会在javaproject
目录下增加下面的内容:
|---target | |---classes | | |---net | | | |---coderbee | | | | |---App.class | |---javaproject-1.0-SNAPSHOT.jar | |---maven-archiver | | |---pom.properties | |---surefire-reports | | |---net.coderbee.AppTest.txt | | |---TEST-net.coderbee.AppTest.xml | |---test-classes | | |---net | | | |---coderbee | | | | |---AppTest.class
其中的javaproject-1.0-SNAPSHOT.jar
就是生成的jar包。
执行命令java -cp target/javaproject-1.0-SNAPSHOT.jar net.coderbee.App
可以看到控制台输出Hello World!
就说明项目创建成功,并且可以运行的。
配置项目
这里简单介绍配置Java文件和资源文件的编码、编译级别。在pom.xml
文件添加如下配置:
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source> <!-- 源代码的级别 -->
<target>1.5</target> <!-- 目标字节码的级别 -->
<encoding>UTF-8</encoding> <!-- Java源文件编码 -->
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.3</version>
<configuration>
<encoding>UTF-8</encoding> <!-- 配置文件编码 -->
</configuration>
</plugin>
</plugins>
</build>
添加依赖库
这里只添加JUnit4作为单元测试框架,用slf4j+logback作为日志框架。Maven默认会添加一个JUnit 3.8.1的库,这里直接改为4.x的。把pom.xml
文件里dependencies
的配置改为下面这样:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.0.13</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.13</version>
</dependency>
</dependencies>
注意:配置JUnit时指定了scope
属性为test
表示只在测试时加入,不会打包到正式的发布包里。
配置日志
还有有日志配置文件,在项目的src/main/
目录下创建resource
目录,放文件logback.xml
;在test/
目录创建resource
目录,放文件logback-test.xml
。
Maven会把src/main/resource/
目录下各种配置文件、资源文件添加到正式包里面;而test/resource/
目录则是在单元测试时生效。这样就可以区分测试环境与正式生产环境的配置,不会犯把测试环境的配置打包到生产环境的错误。
这里使用logback的一个原因是它查找配置时会优先使用classpath
路径下的logback-test.xml
,如果找不到就使用logback.xml
文件。与Maven的理念很吻合。
加入配置后,logback-test.xml
里的日志级别设为debug
,logback.xml
里的日志级别设为error
作为区分,然后分别在AppTest.java
和App.java
里使用不同的日志级别进行输出验证这个配置是否有效。
修改src/main/java/net/coderbee/App.java
类为:
package net.coderbee;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class App {
private static final Logger logger = LoggerFactory.getLogger(App.class);
public static void main( String[] args ) {
logger.debug("debug message . 调试信息。");
logger.error("error message . 错误信息。");
}
}
修改src/test/java/net/coderbee/AppTest.java
类为:
package net.coderbee;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Unit test for simple App.
*/
public class AppTest {
private static final Logger logger = LoggerFactory.getLogger(AppTest.class);
@Test
public void testApp() {
logger.debug("i am simple test method and be ignored .");
}
}
执行单元测试
执行命令mvn test
,可以看到下面这样的输出(截取片段):
2013-11-21 21:40:08,118 [main] DEBUG net.coderbee.AppTest - i am simple test method and be ignored .
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.229 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
打包
打包只需要执行命令mvn package
,生成的jar包会放在target
目录下,编译过程中生成的一些class文件也会放在这个目录的子目录下。
如果编写一个类库,那么这样就ok, 但如果是一个应用程序的话,直接执行这个jar包将会抛出依赖库找不到的异常,因为这个打包只打包了我们编写的类。
好在有个Maven创建可以把依赖库也一起打包进一个jar包里。添加下面的配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>org.noahx.onejartest.Launcher</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>com.jolira</groupId>
<artifactId>onejar-maven-plugin</artifactId>
<version>1.4.4</version>
<executions>
<execution>
<configuration>
<attachToBuild>true</attachToBuild>
<classifier>onejar</classifier>
</configuration>
<goals>
<goal>one-jar</goal>
</goals>
</execution>
</executions>
</plugin>
重新打包,会在target
目录下多生成一个jar包:javaproject-1.0-SNAPSHOT.one-jar.jar
,命名一般为xxxx.one-jar.jar
。
执行这个包: java -jar target/javaproject-1.0-SNAPSHOT.one-jar.jar
,可以看到下面的输出:
22:56:17.733 [main] ERROR net.coderbee.App - error message . 错误信息。
只输出了error级别的日志,debug的没有输出。
欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。