Maven 管理Java工程 入门

这里以普通的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里的日志级别设为debuglogback.xml里的日志级别设为error作为区分,然后分别在AppTest.javaApp.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的没有输出。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.