您的位置:首页 > 编程语言 > Java开发

使用maven构建,打包Java项目完整实例

2014-09-30 22:49 656 查看
使用普通方式构建管理java项目的低效,是我毅然决然的选择maven,使用elipse的长久动火上身,让我大义灭亲放弃eclipse而选择intellJ idea,下面我将使用maven构建,打包一个最简单的过程记录下来。

首先,既然要用maven,这里大概说一下maven是个什么东西。maven不是简简单单的项目构建工具,按照官方的说法,它提供了一个平台,定义为:Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(ProjectLifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。了解一样新东西,先弄懂他的核心概念是必要的:

【核心概念】:

Maven插件和目标 (Plugins and Goals) :一个Maven插件是一个单个或者多个目标的集合。Maven插件的例子有一些简单但核心的插件,像Jar插件,它包含了一组创建JAR文件的目标,Compiler插件,它包含了一组编译源代码和测试代码的目标,或者Surefire插件,它包含一组运行单元测试和生成测试报告的目标。一个目标是一个明确的任务,它可以作为单独的目标运行,或者作为一个大的构建的一部分和其它目标一起运行。

Maven生命周期 (Lifecycle):生命周期是包含在一个项目构建中的一系列有序的阶段Maven可以支一个简单的Maven项目持许多不同的生命周期,但是最常用的生命周期是默认的Maven生命周期,这个生命周期中一开始的一个阶段是验证项目的基本完整性,最后的一个阶段是把一个项目发布成产品。例如compile-》test-》package

Maven坐标 (Coordinates):Maven坐标定义了一组标识,它们可以用来唯一标识一个项目,一个依赖,或者MavenPOM里的一个插件。一个Maven坐标是一个地

址,即“空间”里的某个点:从一般到特殊。当一个项目通过依赖,插件或者父项目引用和另外一个项目关联的时候,Maven通过坐标来精确定位一个项目。Maven坐标通常用

冒号来作为分隔符来书写,像这样的格式:groupId:artifactId:packaging:version。

groupId
d 团体,公司,小组,组织,项目,或者其它团体。团体标识的约定是,它以创建这个项目的组织名称的逆向域名(reverse domain name)开头。来自Sonatype
的项目有一个以com.sonatype开头的groupId,而Apache Software的项目有以org.apache开头的groupId。
artifactId
在groupId下的表示一个单独项目的唯一标识符。
version
一个项目的特定版本。发布的项目有一个固定的版本标识来指向该项目的某一个特定的版本。而正在开发中的项目可以用一个特殊的标识,这种标识给版本加上
一个“SNAPSHOT”的标记。
项目的打包格式也是Maven坐标的重要组成部分,但是它不是项目唯一标识符的一个部分。一个项目的groupId:artifactId:version使之成为一个独一无二的项目;你不能同时有一个拥有同样的groupId, artifactId和version标识的项目。
packaging
项目的类型,默认是jar,描述了项目打包后的输出。类型为jar的项目产生一个	JAR文件,类型为war的项目产生一个web应用。
Maven仓库(Repositories):Maven仓库是通过结构来定义的,一个Maven仓库是项目构件的一个集合,这些构件存储在一个目录结构下面,它们的格式能很容易的被Maven所理解。在一个Maven仓库中,所有的东西存储在一个与Maven项目坐标十分匹配的目录结构中

Maven依赖管理 (Dependency Management):一个复杂的项目将会包含很多依赖,也有可能包含依赖于其它构件的依赖。这是Maven最强大的特征之一,它支持了传递性依赖(transitive dependencies)

站点生成和报告 (Site Generation and Reporting):一个Maven的重要特征是,它能生成文档和报告。在simple项目的目录下,运行以下命令:$ mvn site这将会运行site生命周期阶段。

【maven项目目录结构】:

hello-world/❶
<span style="white-space:pre">	</span>hello-world/pom.xml❷
/src/
/src/main/❸
/main/java
/src/test/❹
/test/java
这个生成的目录遵循Maven标准目录布局,我们之后会去看更多的细节,但是,现在让我们只是尝试了解这些基本的目录。
❶ Maven Archtype插件创建了一个与artifactId匹配的目录——hello-world。这是项目的基础目录。
❷ 每个项目在文件pom.xml里有它的项目对象模型 (POM)。这个文件描述了这个项目,配置了插件,声明了依赖。
❸ 我们项目的源码了资源文件被放在了src/main目录下面。在我们简单Java项目这样的情况下,这个目录包含了一下java类和一些配置文件。在其它的项目中,它
可能是web应用的文档根目录,或者还放一些应用服务器的配置文件。在一个Java项目中,Java类放在src/main/java下面,而classpath资源文件放在src/main/resources下面。
❹ 我们项目的测试用例放在src/test下。在这个目录下面,src/test/java存放像使用JUnit或者TestNG这样的Java测试类。目录src/test/resources下存放测试
classpath资源文件。
以上maven的概念介绍完毕后,我们动手写个demo,改demo很简单,从配置文件(config.yaml)读出问候语,然后再main函数中打印出来,最后打包成一个zip文件,使用脚本来运行:

使用itellJ idea新建一个maven项目,起名为hello-world,如下图:

最终生成的目录结构为:

在src/main下新加两个目录,scripts和assembly,scripts用来存放运行脚本文件,assembly用来存放打包描述

src/main/java/com/changong28/maven下就一个java文件,HelloWorld,内容如下:

package com.changong28.maven;

import org.yaml.snakeyaml.Yaml;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

/**
* Created by zhaoch on 2014/9/30.
*/
public class HelloWorld {
private static Map conf = new HashMap<Object, Object>();

public static void main(String[] args){
String appHome = System.getProperty("app.path.home","G:\\laboratory\\hive\\hello-world\\target\\hello-world-1.0-SNAPSHOT-bin\\hello-world-1.0-SNAPSHOT");
loadYaml(appHome+"/config/config.yaml");
System.out.println(conf.get("greetings"));
}

private static void loadYaml(String confPath) {
System.out.println("confPath:"+confPath);
Yaml yaml = new Yaml();
try {
InputStream stream = new FileInputStream(confPath);
conf = (Map) yaml.load(stream);
} catch (Exception e) {
e.printStackTrace();
}
}
}


src/main/resources/config.yaml为配置信息,内容如下:

greetings: "hello world !"
name:
- Multimedia
- Internet
- Education


src/main/assembly/assembly.xml为打包配置信息,内容如下:

<assembly>
<id>bin</id>
<formats>
<format>zip</format>
<format>dir</format>
</formats>
<dependencySets>
<dependencySet>
<useProjectArtifact>true</useProjectArtifact>
<outputDirectory>lib</outputDirectory>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<outputDirectory>/</outputDirectory>
<includes>
<include>README.txt</include>
</includes>
</fileSet>
<fileSet>
<directory>src/main/scripts</directory>
<outputDirectory>/bin</outputDirectory>
<includes>
<include>run.sh</include>
<include>run.bat</include>
</includes>
</fileSet>
<fileSet>
<directory>src/main/resources</directory>
<outputDirectory>/config</outputDirectory>
</fileSet>
</fileSets>
</assembly>


windows下的执行脚本src/main/scripts/run.bat,内容如下:

@echo off

SETLOCAL

if NOT DEFINED JAVA_HOME goto err

set SCRIPT_DIR=%~dp0
for %%I in ("%SCRIPT_DIR%..") do set APP_HOME=%%~dpfI

REM ***** JAVA options *****

set APP_CLASSPATH=.;%APP_HOME%/lib/*
set APP_PARAMS=-Dapp.path.home="%APP_HOME%"

echo init...
echo APP_HOME: %APP_HOME%
echo APP_CLASSPATH : %APP_CLASSPATH%
echo APP_PARAMS: %APP_PARAMS%
echo init ok!

"%JAVA_HOME%\bin\java" %APP_PARAMS% -cp "%APP_CLASSPATH%" "com.changong28.maven.HelloWorld"
goto finally

:err
echo JAVA_HOME environment variable must be set!
pause

:finally

ENDLOCAL


执行mvn package后,会在hello-world下生产一个target目录,该目录下生成hello-world-1.0-SNAPSHOT-bin.zip包,解压下到bin目录运行run.bat既可进行测试。

完整实例下载:http://download.csdn.net/detail/changong28/7994603









参考:maven权威指南

http://www.infoq.com/cn/news/2011/06/xxb-maven-9-package
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: