blogjava-凯发k8网页登录http://www.blogjava.net/xzclog/category/32016.htmlzh-cnfri, 08 jul 2011 03:55:08 gmtfri, 08 jul 2011 03:55:08 gmt60maven2 学习 - maven 命令http://www.blogjava.net/xzclog/archive/2011/07/08/353930.htmlxzcxzcfri, 08 jul 2011 03:20:00 gmthttp://www.blogjava.net/xzclog/archive/2011/07/08/353930.htmlhttp://www.blogjava.net/xzclog/comments/353930.htmlhttp://www.blogjava.net/xzclog/archive/2011/07/08/353930.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/353930.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/353930.html常用命令
       maven2 的运行命令为 : mvn ,
常用命令为 :
             mvn archetype:create :创建 maven 项目
             mvn compile :编译源代码
             mvn test-compile :编译测试代码
             mvn test : 运行应用程序中的单元测试
             mvn site : 生成项目相关信息的网站
             mvn clean :清除目标目录中的生成结果
             mvn package : 依据项目生成 jar 文件
             mvn install :在本地 repository 中安装 jar
             mvn eclipse:eclipse :生成 eclipse 项目文件
生成项目
             建一个 java 项目 : mvn archetype:create -dgroupid=com.demo -dartifactid=app
          建一个 web 项目 : mvn archetype:create -dgroupid=com.demo -dartifactid=web-app -darchetypeartifactid=maven-archetype-webapp

简单解释一下:
archetype  是一个内建插件,他的create任务将建立项目骨架
archetypeartifactid   项目骨架的类型
dartifactid 项目名称

可用项目骨架有:
* maven-archetype-archetype
* maven-archetype-j2ee-simple
* maven-archetype-mojo
* maven-archetype-portlet
* maven-archetype-profiles (currently under development)
* maven-archetype-quickstart
* maven-archetype-simple (currently under development)
* maven-archetype-site
* maven-archetype-site-simple, and
* maven-archetype-webapp

附maven2 生成项目标准目录布局
src/main/javaapplication/library sources
src/main/resourcesapplication/library resources
src/main/filtersresource filter files
src/main/assemblyassembly descriptors
src/main/configconfiguration files
src/main/webappweb application sources
src/test/javatest sources
src/test/resourcestest resources
src/test/filterstest resource filter files
src/sitesite
license.txtproject's license
readme.txtproject's readme


xzc 2011-07-08 11:20
]]>
创建简单的maven archetype http://www.blogjava.net/xzclog/archive/2011/07/08/353917.htmlxzcxzcfri, 08 jul 2011 02:13:00 gmthttp://www.blogjava.net/xzclog/archive/2011/07/08/353917.htmlhttp://www.blogjava.net/xzclog/comments/353917.htmlhttp://www.blogjava.net/xzclog/archive/2011/07/08/353917.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/353917.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/353917.html 
2011-07-05
    博客分类:

如果你想定义一个maven工程模板,有一种很快的方法:
1.定义你开发环境的目录结构,写一个pom.xml.
2.使用命令,mvn archetype:create-from-project 创建一个工程模板。
3.在target目录下执行mvn install.执行完之后你就可以使用你的模板了。
4.执行命令,mvn archetype:generate -darchetypecatalog=local就可以开始使用你定义的模板创建工程。

例子:
1.创建目录结构如下:
demo
--src
--main
--resources
--test
--webapp
pom.xml

pom.xml内容:              
xsi:schemalocation="http://maven.apache.org/pom/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
gdemo
demo
jar
1.0
maven quick start archetype
http://maven.apache.org


junit
junit
3.8.1
test




2.在demo目录下执行命令,mvn archetype:create-from-project

3.在创建的target\generated-sources\archetype目录下执行,mvn install.
到此你的工程模板创建完成。在以后开发中就可以使用它。

4.执行mvn archetype:generate -darchetypecatalog=local会看到模板选项,选择刚才创建的模板,然后进行下面的设置。
到此恭喜你,成功使用。



xzc 2011-07-08 10:13
]]>
maven入门--概念与实例 http://www.blogjava.net/xzclog/archive/2006/10/29/77910.htmlxzcxzcsun, 29 oct 2006 08:29:00 gmthttp://www.blogjava.net/xzclog/archive/2006/10/29/77910.htmlhttp://www.blogjava.net/xzclog/comments/77910.htmlhttp://www.blogjava.net/xzclog/archive/2006/10/29/77910.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/77910.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/77910.html最近由于工作原因在研究、应用maven,有了一些体会就写成了此文。本文虽然是maven2的入门文章,但并不涉及maven的历史、下载与安装,这些内容可以到maven的官方网站上了解。本文主要是关注maven中的重要概念,并以一个实例来阐述使用maven的基本方法。文末有例子代码下载的链接。(2006.10.29最后更新)
1 关键名词
    project:任何您想build的事物,maven都可以认为它们是工程。这些工程被定义为工程对象模型(pom,poject object model)。一个工程可以依赖其它的工程;一个工程也可以由多个子工程构成。
    pom:pom(pom.xml)是maven的核心文件,它是指示maven如何工作的元数据文件,类似于ant中的build.xml文件。pom文件位于每个工程的根目录中。
    groupid:groupid是一个工程的在全局中唯一的标识符,一般地,它就是工程名。groupid有利于使用一个完全的包名,将一个工程从其它有类似名称的工程里区别出来。
    artifact:artifact是工程将要产生或需要使用的文件,它可以是jar文件,源文件,二进制文件,war文件,甚至是pom文件。每个artifact都由groupid和artifactid组合的标识符唯一识别。需要被使用(依赖)的artifact都要放在仓库(见repository)中,否则maven无法找到(识别)它们。
    dependency:为了能够build或运行,一个典型的java工程会依赖其它的包。在maven中,这些被依赖的包就被称为dependency。dependency一般是其它工程的artifact。
    plug-in:maven是由插件组织的,它的每一个功能都是由插件提供的。插件提供goal(类似于ant中的target),并根据在pom中找到的元数据去完成工作。主要的maven插件要是由java写成的,但它也支持用beanshell或ant脚本写成的插件。
    repository:仓库用于存放artifact,它可以是本地仓库,也可以是远程仓库。maven有一个默认的远程仓库--central,可以从http://www.ibiblio.org/maven2/下载其中的artifact。在windows平台上,本地仓库的默认地址是user_home\.m2\repository
    snapshot:工程中可以(也应该)有一个特殊版本,它的版本号包括snapshot字样。该版本可以告诉maven,该工程正处于开发阶段,会经常更新(但还未发布)。当其它工程使用此类型版本的artifact时,maven会在仓库中寻找该artifact的最新版本,并自动下载、使用该最新版。
2 maven build life cycle
    软件项目一般都有相似的开发过程:准备,编译,测试,打包和部署,maven将上述过程称为build life cycle。在maven中,这些生命周期由一系列的短语组成,每个短语对应着一个(或多个)操作;或对应着一个(或多个)goal(类似于ant中的target)。
    如编译源文件的命令mvn compile中的compile是一个生命周期短语。同时该命令也可以等价于mvn compiler:compile,其中的compiler是一个插件,它提供了compile(此compile与mvn compile中的compile意义不同)goal;compiler还可提供另一个goal--testcompile,该goal用于编译junit测试类。
    在执行某一个生命周期时,maven会首先执行该生命周期之前的其它周期。如要执行compile,那么将首先执行validate,generate-source,process-source和generate-resources,最后再执行compile本身。关于maven中默认的生命周期短语,请见参考资源[6]中的附录b.3
3 标准目录布局
    maven为工程中的源文件,资源文件,配置文件,生成的输出和文档都制定了一个标准的目录结构。maven鼓励使用标准目录布局,这样就不需要进行额外的配置,而且有助于各个不同工程之间的联接。当然,maven也允许定制个性的目录布局,这就需要进行更多的配置。关于maven的标准目录布局,请见参考资源[6]中的附录b.1
4 maven的优点
    [1]build逻辑可以被重用。在ant中可能需要多次重复地写相同的语句,但由于pom的继承性,可以复用其它的pom文件中的语句。这样既可以写出清晰的build语句,又可以构造出层次关系良好的build工程。
    [2]不必关注build工作的实现细节。我们只需要使用一些build生命周期短语就可以达到我们的目标,而不必管maven是如何做到这些的。如,只需要告诉maven要安装(install),那么它自然就会验证,编译,打包,及安装。
    [3]maven会递归加载工程依赖的artifact所依赖的其它artifact,而不用显示的将这些artifact全部写到dependency中。
    [4]如果完全使用maven的标准目录布局,那么可以极大地减少配置细节。
5 实例
5.1 构想
    由于只是阐述maven的基本使用方法,所以本文将要设计的实例,只是一个简单的maven demo。该实例包含两个工程:普通应用程序工程(app)和web应用工程(webapp)。app工程提供一个简单的java类;webapp工程只包含一个servlet,并将使用app中的java类。
    该demo的目标是能够正确地将webapp制成war包,以供部署时使用。要能够正确制作war,自然首先就必须要能够正确的编译源代码,且要将app模块制成jar包。本文创建的工程所在的目录是d:\maven\demo
5.2 app工程
    可以使用maven的archetype插件来创建新工程,命令如下:
    d:\maven\demo>mvn archetype:create -dgroupid=ce.demo.mvn -dartifactid=app
该工程的groupid是ce.demo.mvn,那么该工程的源文件将放在java包ce.demo.mvn中。artifactid是app,那么该工程根目录的名称将为app。
    当第一次执行该命令时,maven会从central仓库中下载一些文件。这些文件包含插件archetype,以及它所依赖的其它包。该命令执行完毕后,在目录d:\maven\demo下会出现如下目录布局:
app
|-- pom.xml
`-- src
    |-- main
    |   `-- java
    |       `-- ce
    |           `-- demo
    |               `-- mvn
    |                   `-- app.java
    `-- test
        `-- java
            `-- ce
                `-- demo
                    `-- mvn
                        `-- apptest.java
因本文暂时不涉及junit测试,故请将目录app\src\test目录删除(不删除也没关系 ^_^)。然后再修改app.java文件,其完全内容如下:
package ce.demo.mvn;
public class app {
    
public string getstr(string str) {
        
return str;
    }

}
其实,如果我们能够清楚地知道maven的标准目录布局,就可以不使用archetype插件来创建工程原型;如果我们要定制个性的目录布局,那么就更没有必要使用archetype插件了。
5.3 webapp工程
    我们仍然如创建app工程一样使用archetype插件来创建webapp工程,命令如下:
   
d:\maven\demo>mvn archetype:create -dgroupid=ce.demo.mvn -dartifactid=webapp -darchetypeartifactid=maven-archetype-webapp
    第一次运行此命令时,也会从central仓库中下载一些与web应用相关的artifact(如javax.servlet)。此命令与创建app的命令的不同之处是,多设置了一个属性archetypeartifacttid,该属性的值为maven-archetype-webapp。即告诉maven,将要创建的工程是一个web应用工程。创建app工程时没有使用该属性值,是由于archetype默认创建的是应用程序工程。同样的,执行完该命令之后,会出现如下标准目录布局:
webapp
|-- pom.xml
`-- src
    `-- main
        `-- webapp
           
|-- index.jsp
            |-- web-inf
                `-- web.xml
    根据5.1节的构想,webapp工程将只包含一个servlet,所以我们不需要index.jsp文件,请将其删除。此时大家可以发现,目前的目录布局中并没有放servlet,即java源文件的地方。根据参考资源[6]中的附录b.1,以及app工程中java源文件的布局,可以知道servlet(它仍然是一个java类文件)仍然是放在webapp\src\main\java目录中,请新建该目录。此处的servlet是一个简单helloservlet,其完整代码如下:
package hello;

import java.io.ioexception;
import java.io.printwriter;
import javax.servlet.servletexception;
import javax.servlet.http.httpservlet;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;

import ce.demo.mvn.app;  // 引用app工程中的app类

public class helloservlet extends httpservlet {
    
private static final long serialversionuid = -3696470690560528247l;
    
public void doget(httpservletrequest request, httpservletresponse response)
            
throws servletexception, ioexception {
        app app 
= new app();
        string str 
= app.getstr("ce maven demo");
        printwriter out 
= response.getwriter();
        out.print(
"");
        out.print(
"

blogjava-凯发k8网页登录

5.4 pom文件
    大家可以发现,在前面新建工程时,我们并没有提到各个工程中的pom.xml文件。现在将要讨论这个问题。我们先看看app工程中的pom文件,其完整内容如下:
<project>
  
<modelversion>4.0.0modelversion>
  
<groupid>ce.demo.mvngroupid>
  
<artifactid>appartifactid>
  
<packaging>jarpackaging>
  
<version>1.0version>
  
<name>ce maven demo -- appname>
project>
    大家可以发现此我帖出来的内容与实际由archetype插件生成的pom文件的内容有些不同,但基本上是一致的。只是为了使文件中的语句更清晰,此处删除了一些冗余的内容,并修改了该工程的version和name的值,以与此例子的背景来符合。在目前情况下modelversion值将被固定为4.0.0,这也是maven2唯一能够识别的model版本。groupid,artifactid的值与创建工程时使用的命令中的相关属性值是一致的。packaging的值由工程的类型决定,如应用程序工程的packaging值为jar,web应用工程的packaging值为war。上述情况也可以从webapp的pom文件中看出,下面将看看这个pom的完整内容。
<project>
  
<modelversion>4.0.0modelversion>
  
<groupid>ce.demo.mvngroupid>
  
<artifactid>webappartifactid>
  
<packaging>warpackaging>
  
<version>1.0version>
  
<name>ce maven demo -- webappname>
  
  
<dependencies>
      
<dependency>
          
<groupid>ce.demo.mvngroupid>
          
<artifactid>appartifactid>
          
<version>1.0version>
      
dependency>
    
<dependency>
        
<groupid>javax.servletgroupid>
        
<artifactid>servlet-apiartifactid>
        
<version>2.4version>
        
<scope>providedscope>
    
dependency> 
  
dependencies>
project>
    比较app与webapp中的pom,除前面已经提过的packaging的差别外,我们还可以发现webapp中的pom多了dependencies项。由于webapp需要用到app工程中的类(见helloservlet源代码),它还需要javax.servlet包(因为该包并不默认存在于jsdk中)。故,我们必须要将它们声明到依赖关系中。
5.5 执行
    上述两个工程创建完毕后,就需要执行一些命令来看看会有什么结果出现。我们首先进入app目录,并执行命令mvn compile,然后会在该目录下发现新生成的目录target\classes,即编译后的class文件(包括它的包目录)就放在了这里。再执行命令mvn package,在目录target中就会生成app-1.0.jar文件。该文件的全名由如下形式确定:artifactid-version.packaging。根据第2章的叙述可以知道,执行命令mvn package时,将首先将产生执行命令mvn compile之后的结果,故如果要打包,那么只需要执行mvn package即可。
    在app工程中执行完之后,就需要进入webapp工程了。进入webapp目录,此次将只执行mvn package命令(隐示地执行了compile过程)。此次命令的执行并不成功,会出现如下问题:
d:\maven\demo\webapp>mvn package
……
downloading: http://repo1.maven.org/maven2/ce/demo/mvn/app/
1.0/app-1.0.pom
[info] ------------------------------------------------------------------------
[error] build error
[info] ------------------------------------------------------------------------
[info] error building pom (may not be this project's pom).
project id: ce.demo.mvn:app
reason: error getting pom for 'ce.demo.mvn:app' from the repository: error transferring file
  ce.demo.mvn:app:pom:
1.0
from the specified remote repositories:
  central (http://repo1.maven.org/maven2)
……
    由粗体内容可知,maven正试图从central仓库下载app工程的artifact,但central仓库肯定不会有这个artifact,其结果只能是执行失败!由第1章artifact名词的解释可知,被依赖的artifact必须存在于仓库(远程或本地)中,但目前webapp所依赖的app必不存在于仓库中,所以执行只能失败。
    解决这个问题有两种方法:[1]将app-1.0.jar安装到仓库中,使它成为一个artifact;[2]构建一个更高层次的工程,使app和webapp成为这个工程的子工程,然后从这个更高层次工程中执行命令。
    第一种方法比较简单(
http://www.blogjava.net/jiangshachina/admin/editposts.aspx中的第一个主题),此处将详细讨论第2种方法(见5.6节)。
5.6 更高层次工程
    我们可以将app和webapp的上一级目录demo作为这两个工程的 一个
更高层次工程,即使用app和webapp成为这个工程的子工程。为了使demo目录成为一个demo工程,只需要在这个目录下添加一个pom.xml文件,该文件内容如下:
<project>
    
<modelversion>4.0.0modelversion>
    
<groupid>ce.demogroupid>
    
<artifactid>mvn-demoartifactid>
    
<packaging>pompackaging>
    
<version>1.0version>
    
<name>ce maven demoname>
    
    
<modules>
        
<module>appmodule>
        
<module>webappmodule>
    
modules>
project>
    与app和webapp中的pom相比,demo的pom使用了modules项,modules用于声明本工程的子工程,module中的值对应于子工程的artifact名。而且该pom的packaging类型必须为pom。
    有了demo工程后,我们只需要在demo目录下执行相关命令就可以了。通过如下命令即可验证:
    [1]mvn clean – 消除工程(包括所有子工程)中产生的所有输出。这本文的实例中,实际上是删除target目录。由于之前的操作只有app工程产生了target目录,而webapp并没有,所以将只会删除app工程中的target目录。
    [2]mvn package – 将工程制作成相应的包,app工程是作成jar包(app-1.0.jar),webapp工程是作成war包(webapp-1.0.war)。打开webapp-1.0.war包,可以发现app-1.0.jar被放到了web-inf的lib目录中。
6 小结
    通过以上的叙述与实例,应该可以对maven有一个粗略的认识了。使用maven关键是要弄清楚如何写pom.xml文件,就如同使用ant要会写build.xml文件一样。在pom中可以直接写入ant的task脚本,也可以调用ant的build.xml文件(推荐),所以maven也可以完成ant的绝大多数工作(但不必安装ant)。注意:使用maven就不要再过多的使用ant脚本
    利用好maven的继承特性及子工程的关系,可以很好地简化pom文件,并能够构建层次结构良好的工程,有利于工程的维护。
7 参考资源
[1]maven官方网站. http://maven.apache.org
[2]maven pom文件参考结构. http://maven.apache.org/ref/current/maven-model/maven.html
[3]super pom. http://maven.apache.org/guides/introduction/introduction-to-the-pom.html
[4]maven主要插件的列表. http://maven.apache.org/plugins
[5]maven基本使用指南. http://maven.apache.org/guides/index.html
[6]better build with maven. http://www.mergere.com/m2book_download.jsp -- 强烈推荐
[7]介绍maven2. http://www.javaworld.com/javaworld/jw-12-2005 /jw-1205-maven_p.html
[8]揭秘maven2 pom. http://www.javaworld.com/javaworld/jw-05-2006/jw-0529-maven.html
[9]maven让事情变得简单. http://www-128.ibm.com/developerworks/cn/java/j-maven
[10]maven文档集. http://docs.codehaus.org/display/mavenuser/home
[11]有效利用maven2的站点生成功能. http://www.matrix.org.cn/resource/article/44/44491_maven2.html
文中例子程序下载:


xzc 2006-10-29 16:29
]]>
ant的一些偏门技巧 http://www.blogjava.net/xzclog/archive/2006/10/23/76739.htmlxzcxzcmon, 23 oct 2006 05:40:00 gmthttp://www.blogjava.net/xzclog/archive/2006/10/23/76739.htmlhttp://www.blogjava.net/xzclog/comments/76739.htmlhttp://www.blogjava.net/xzclog/archive/2006/10/23/76739.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/76739.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/76739.html 一,为减小 build.xml 文件的大小,使用xml实体

 

把属性的设置都放一个 xml 文件中

props.xml 文件

< property name ="build.dir" value ="build" />

然后在 build.xml 文件中加入如下

doctype project [ ]>

 

二,将多个目录的源文件编译到一个地方

 

< javac destdir ="build/classes">

    < src path ="src1"/>

    < src path ="src2"/>

javac >

 

三,保存构建时的信息

 

< project default ="init">

    < target name ="init"> target >

    < property environment ="env" />

    < property name ="env.computername" value ="${env.hostname}" />

    < propertyfile comment ="build information" file ="./buildinfo.properties">

        < entry key ="build.host" value ="${env.computername}" />

        < entry key ="build.user.name" value ="${user.name}" />

        < entry key ="build.os.name" value ="${os.name}" />

    propertyfile >

project >

 

四,去除属性文件的注释

 

属性文件:

# 这里是注释,会给过滤掉

build.dir =build

build 文件:

< copy file ="props.properties" todir ="sample">

    < filterchain >

        < striplinecomments >

            < comment value ="#" />

        striplinecomments >

    filterchain >

copy >

 

五,两个花俏的功能

 

1. 声音提示

< project name ="sound" default ="all">

    < property file ="build.properties" />

    < target name ="init">

        < sound >

            < success source ="${sound.dir}/success.wav" duration ="500" />

            < fail source ="${sound.dir}/fail.wav" loops ="2" />

        sound >

    target >

    < target name ="fail" depends ="init">

        < fail />

    target >

    < target name ="success" depends ="init" />

    < target name ="all" depends ="success" />

project >

 

2. 进度条提示

< project name ="splash" default ="init">

    < target name ="init">

        < splash imageurl ="http://java.chinaitlab.com/uploadfiles_8734/200610/20061021103415601.gif" showduration ="5000" />

        < sleep seconds ="1" />

        < sleep seconds ="1" />

        < sleep seconds ="1" />

        < sleep seconds ="1" />

        < sleep seconds ="1" />

        < sleep seconds ="1" />

    target >

project >



xzc 2006-10-23 13:40
]]>
网站地图