??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲 无码 在线 专区,亚洲性日韩精品一区二区三区,亚洲精品无码专区http://www.tkk7.com/jiangshachina/category/16092.html同是Java爱好者,盔R何必曾相识Q?lt;br>    a cup of Java, cheers!zh-cnWed, 14 Dec 2011 21:04:00 GMTWed, 14 Dec 2011 21:04:00 GMT60最大限度利用Maven settings.xml文g(?http://www.tkk7.com/jiangshachina/archive/2009/08/14/291103.htmlSha JiangSha JiangFri, 14 Aug 2009 11:13:00 GMThttp://www.tkk7.com/jiangshachina/archive/2009/08/14/291103.htmlhttp://www.tkk7.com/jiangshachina/comments/291103.htmlhttp://www.tkk7.com/jiangshachina/archive/2009/08/14/291103.html#Feedback0http://www.tkk7.com/jiangshachina/comments/commentRss/291103.htmlhttp://www.tkk7.com/jiangshachina/services/trackbacks/291103.html最大限度利用Maven settings.xml文g
John Ferguson在他?a >最新Blog中,介绍了?a >Maven settings.xml文g的一些鲜Zh知的技巧,希望对大家也有所助益?2009.08.14最后更?

如果你在ME度中用过MavenQ你应该知道settings.xml文g?a >settings.xml文g包含有与pȝ环境相关的配|细节,例如代理配置Q仓库,服务器的用户名和密码Q等{?br /> 下面是一个典型的settings.xml文g的示例:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation
="http://maven.apache.org/SETTINGS/1.0.0
                      http://maven.apache.org/xsd/settings-1.0.0.xsd"
>
  
<localRepository>C:/maven/repository</localRepository>

  
<proxies>
    
<proxy>
      
<id>localproxy</id>
      
<active>true</active>
      
<protocol>http</protocol>
      
<host>proxy.acme.com</host>
      
<port>8080</port>
      
<username>scott</username>
      
<password>t0ps3cr3t</password>
      
<nonProxyHosts>*.acme.com</nonProxyHosts>
    
</proxy>
  
</proxies>
  
  
<servers>
    
<server>
      
<id>dbserver</id>
      
<username>scott</username>
      
<password>tiger</password>
    
</server>
  
</servers>
  
</settings>
例如Q若你用公司的环境Q在该环境中Q你的Mavenȝ录是每天早晨当你d时由|络传输的,localRepository元素׃非常有用。在q种情况 下,本C库置于你本地盘的不同目录中Q将会节U大量的带宽?br /> 你也可以在settings.xml文g中定义仓库,镜像Q概q和属性。在此处Q我不想涉及上述内容Q因为在其它地方已经有关于它们的很好的文档了?br /> 很少Zh所知,或至是很少被用的功能是,在你的pom.xml文g中用定义在settings.xml文g中的数据?span style="font-size: 10pt;">事实上,你能使用settings.xml中的M元素Q然而其中的一些则更ؓ有用?br /> 一个普遍且方便的例子就是?strong>localRepository变量。你可能需要将该变量置于一个脚本中Q或使用它来引用仓库中的某个特定的JAR文g(管通常有更优雅的方案来解决q一问题)。你可以通过单地引用${settings.localRepository}来?strong>localRepository属性。例如,在下面的代码中,我们调用一个Ant脚本Qƈ通过名ؓ"localRepository"的属性传l它一个本C库\径:
<plugin>
  
<groupId>org.apache.maven.plugins</groupId>
  
<artifactId>maven-antrun-plugin</artifactId>
  
<executions>
    
<execution>
      
<id>generate-stuff</id>
      
<phase>pre-comile</phase>
      
<goals>
        
<goal>run</goal>
      
</goals> 
      
<configuration>
        
<tasks>
          
<ant target="generate">
            
<property name="localRepository"  value="${settings.localRepository}"/>
          
</ant>
        
</tasks>
      
</configuration>
    
</execution>
  
</executions>
</plugin>
做更多有的事情Q特别是当你也在构徏中集成了Groovy时。例如,假设在集成测试阶D|_我们需要确保特定的SQL脚本已在数据库中执行q了。我们有一个名为update-scripts.groovy的Groovy脚本来做qg事情Q但它需要以命o行参数的形式提供用户名和密码。在集成试阶段之前Q你应如何用定义在settings.xml中的用户名和密码呢?是的Q只需一点儿Groovy术Q没有比q儿更简单的了?strong>settings对象可用于Q何集成到pom.xml中的Groovy脚本Q所以你可像使用一个普通对象那h便地使用它,如下CZQ?br />
<plugin>
  
<groupId>org.codehaus.groovy.maven</groupId>
  
<artifactId>gmaven-plugin</artifactId>
  
<version>1.0-rc-5</version>
  
<executions>
    
<execution>
      
<id>process-db-scripts</id>
      
<phase>pre-integration-test</phase>
      
<goals>
        
<goal>execute</goal>
      
</goals> 
      
<configuration>
        
<source>
        def server = settings.servers.find{ it.id.equals('dbserver') }
        """groovy update-scripts.groovy -Ddb.username=${server.username} 
        -Ddb.password=${server.password}""".execute()
        
</source>
      
</configuration>
    
</execution>
  
</executions>
</plugin>
单!事实上,一旦你既知道如何访问顶U变量,又知道如何访问settings.xml中的各个元素Q那么其功效不可限量!只需C一定要使你的构Z持弹?-例如Q不要在settings.xml文g中定义那些在pom.xml文g中无有效默认值的属性?br /> 如果你想学习更多关于应用Maven的酷炫方法,查看最新的来自于Sonatype的在U课E?/a>。或者,Z有一个更具全景的视角Q可以参?a >Java Power Tools bootcamp会议--很快在堪ҎQ悉|布里斯班和惠灵顿有研讨会了?



Sha Jiang 2009-08-14 19:13 发表评论
]]>
Maven入门--较复杂的实例(?http://www.tkk7.com/jiangshachina/archive/2006/12/12/79093.htmlSha JiangSha JiangTue, 12 Dec 2006 10:03:00 GMThttp://www.tkk7.com/jiangshachina/archive/2006/12/12/79093.htmlhttp://www.tkk7.com/jiangshachina/comments/79093.htmlhttp://www.tkk7.com/jiangshachina/archive/2006/12/12/79093.html#Feedback18http://www.tkk7.com/jiangshachina/comments/commentRss/79093.htmlhttp://www.tkk7.com/jiangshachina/services/trackbacks/79093.htmlMaven入门--较复杂的实例
本文用一个较复杂的实例,讲述如何定制目录布局(即不使用Maven标准目录布局)Q以及讲qC些关键插件的使用(配置)。ؓ了方便其它朋友能够方便地使用该实例,后台数据库用开源的面向对象数据?-db4oQ该数据库无需安装Q已包含在与本文配套的实例中Q文末附有该实例的下载链接?2007.01.02最后更?
注:转蝲时请注明原作?jiangshachina)及出?http://www.tkk7.com/jiangshachina)Q?/span>

1 实例的构?/font>
文章开头的摘要已经讲述了,本文仍然以一个实例描q如何用MavenQ?/font> 该实例将使用非Maven标准的目录结构,q将呈现一些关键的Maven插g的配|与应用?/font> 该实例是一个基于db4o的数据库Web应用。该应用本n十分单,即从db4o数据库中查询q记录ƈ它们显现在Web面中?br />     该实例仍然由一个普通应用工E?demo-app)与一个Web应用工程(demo-web)Q以及这两个工程的父工程(demo)构成Q最l的目标是将Web应用工程制作成war文gQƈ部v到JBoss服务器中。启动服务器后,能够在页面中看到正确的查询结果?/font>
    该实例?font color="#008000">Eclipse3.2 + JDK1.5.0_10 + Windows2000开发。当然这仅仅只是我个人的开发^収ͼ但该实例q不受限于此q_Q由于我选择使用db4o针对JDK1.5的品包Q所以该实例只能q行在JDK1.5.0或更高版本的JDK/JRE中;
该工E中的所有文仉使用UTF-8~码方式?/font>

2 demo工程
demo工程是其它两个工E的父工E,它的主要职责是预定义子工E所需要依赖的jar文g(artifact)Q以及针对子工程所使用的插件进行通用配置。该工程完整的POM文g如下所C:
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>mvn.demo</groupId>
    <artifactId>demo</artifactId>
    <packaging>pom</packaging>
    <version>
1.0-SNAPSHOT</version>
    <description>Maven Demo Project</description>

    <modules>
        <module>demo-app</module>
        <module>demo-web</module>
    </modules>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>mvn.demo</groupId>
                <artifactId>demo-app</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>mvn.demo</groupId>
                <artifactId>demo-web</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>com.db4o</groupId>
                <artifactId>db4o-java5</artifactId>
                <version>
5.5</version>
            </dependency>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
                <version>
2.4</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>commons-configuration</groupId>
                <artifactId>commons-configuration</artifactId>
                <version>
1.2</version>
                <exclusions>
                    <exclusion>
                        <groupId>dom4j</groupId>
                        <artifactId>dom4j</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>xml-apis</groupId>
                        <artifactId>xml-apis</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>xalan</groupId>
                        <artifactId>xalan</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>xerces</groupId>
                        <artifactId>xercesImpl</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
        <groupId>junit</groupId>
         <artifactId>junit</artifactId>
           <version>
3.8.1</version>
      <scope>test</scope>
    </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <configuration>
                    <encoding>UTF-
8</encoding>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>
1.5</source>
                    <target>
1.5</target>
                    <encoding>UTF-
8</encoding>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <addMavenDescriptor>false</addMavenDescriptor>
                    </archive>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                    <archive>
                        <addMavenDescriptor>false</addMavenDescriptor>
                    </archive>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-javadoc-plugin</artifactId>
                <configuration>
                    <charset>UTF16</charset>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
    预定义工E的依赖关系Q就是把会被子工E依赖的artifact的详l信?groupIdQartifactIdQversionQ?..)先声明到<dependencyManagement>中。然后子工程只需要声明用某个artifact可以了Q即那时只需要设|groupId和artifactId(甚至更少)可以了?/font> <dependencyManagement>中声明的artifactq不一定真的会被用到?/font>
2.1 声明依赖关系
    Ҏ实际情况Q?/font> 该实?/font> 需要用db4o针对java5的品包(jar文g)。由于该jar文gq不存在于Maven的中央仓库中Q所以我们不能直接通过Maven获得该jar文g。我们只能另外下载db4o-5.5(Java?的压~包Q然后从压羃包内获得db4o-java5.jar。得到该jar后,必须先将它安装到Maven的本C库中(安装Ҏ参见资源[1]Q主?向本C库安装文件时要生成POM文g")Q以备后面的使用。此处将该artifact的groupId定义?font color="#0000ff">com.db4oQartifactId定义?font color="#0000ff">db4o-java5Qversion自然是5.5?误上述POM脚本)?br />
    ׃该实例最l是一个Web应用Q所以它臛_需要依赖Servlet的包(servlet-api-2.4.jar)Q还需要commons-configuration-1.2.jar。这两个artifact都已l存在于Maven中央仓库中,所以我查找到它们后Q按照Maven中央仓库的命名将它们声明C<dependencyManagement>?误上述POM脚本)。junit是进行单元测试时使用的artifactQ?假设)它肯定会被每个工E用,所以没有将它设|到 <dependencyManagement>中,而直接设|到?/font> <dependency>中?/font>
    l心的朋友肯定已l发CQ针?/font> commons-configuration的依赖声明处多了一些语句。从表面上看Q应该是排除?个artifact(dom4jQ?/font> xml-apis Q?/font> xalan ?/font> xerces )。不错,是排除了这4个jar文g(artifact)。如果有兴趣的话Q可以将整个<exclusions>元素删除Q然后再试一下制作war文g。你会发现在WEB-INF/lib目录下存在着q?个artifact对应的jar文g。那我ؓ什么要它?#8220;排除”呢?因ؓQ它们是多余的!卻I它们对于我的q个Web应用来说Q根本就是无用的Q?br />     Maven2加入了一个很好的Ҏ:自动加蝲“依赖的依?Transitive Dependency)”。以commons-configurationZ。ؓ了能够让它运行正常,我们实际上还需要其它一些jar(artifact)Q如commons-collectionsQcommons-langQ?..。但q些artifact我都没有“昄”地声明需要依赖它们,但Maven会自动加载,因ؓ commons-configuration的POM文g它们声明ؓ了dependency ?br />     既然那个4个artifact?font size="2">commons-configuration的依赖,Z么会认ؓ它们是无用的呢?实际上,它们׃应该被声明到commons-configuration的依赖关pM。这?/font>commons-configuration开发者的pQ他们没有将依赖关系整理清晰Q而将一些确实既不是runtimeQ更不是compile-time需要的artifact攑օC依赖关系中。在Maven中央仓库中存在着很多q种情况Q所以我们有旉要弄清楚“哪些文g是我们真正需要的Q哪些是可以被清除的”。但有时候,很难做到一个不漏。正是由于这一原因Q自动加载Transitive Dependencyq一极好的特性,有时让h十分无奈 ^_^
2.2 Ҏ件进行基本配|?/strong>
我们可以把对插g的全局?如针Ҏ个项目的)讄攑ֈ较高层次的POM文g中,因ؓ它们被设|后Q子工程们就会自焉守它们,而且可以使每个子工程的情况都是一L?br />     在第1节中Q已l表明该工程使用JDK1.5q_Qƈ且所有文仉使用UTF-8
的编码方?/font>。而Maven默认使用JDK1.3U别的javac~译器;默认使用本地~码方式(体中文Windows操作pȝ默认使用GBK~码方式)处理文g。这样就必须对Mavenq行适当讄Q以满工程的实际需要?br />     针对资源文g的处?font color="#000000">QMaven使用maven-resources-plugin插gQ需要将它的~码方式讄为UTF-8。编译Java源文Ӟ是用maven-compiler-plugin插gQ需要将它的source(Java源文?与target(class文g)的别都讄?.5Q另外还要将它的encoding方式讄为UTF-8。(详细讄误POM脚本Q?/font>

3 demo-app工程
demo-app工程是一个普通应用程序工E,它用于处理和数据库相关的操作Q如针对数据库的增、删、改、查{基本功能。该工程POM文g的主要内容如下所C:
<project>
    ......

    <build>
        <finalName>app</finalName>
        <directory>target</directory>

        <sourceDirectory>src/java</sourceDirectory>
        <outputDirectory>target/classes</outputDirectory>
        <resources>
            <resource>
                <directory>src/java</directory>
                <excludes>
                    <exclude>**/*.java</exclude>
                </excludes>
            </resource>
        </resources>

        <testSourceDirectory>src/test/java</testSourceDirectory>
        <testOutputDirectory>target/test-classes</testOutputDirectory>
        <testResources>
            <testResource>
                <directory>src/test/java</directory>
                <excludes>
                    <exclude>**/*.java</exclude>
                </excludes>
            </testResource>
        </testResources>
    </build>
</project>
    文章的开头已l提刎ͼ本实例将会用定制的目录l构Q但在前面却一字不提此事,现在描q如何定制目录结构。Maven的标准目录结构其实是在Super POM中设|的Q由于Q何POM都会l承该POMQ所以所有的工作都会默认使用标准目录l构。要定制目录Q其实就是需要重新设|相兛_数的|即用新D盖Super POM中的倹{?br />
[1]<finalName>Q该元素指定了工E输出的artifact的名Uͼ默认gؓ${artifactId}-${version}Q此处修改ؓapp?br /> [2]<directory>Q该元素指定了工E输出的目标目录。默认gؓtargetQ此处未修改变?br /> [3]<sourceDirectory>Q该元素指定了Java源文件所在的目录。默认gؓsrc/main/javaQ此处修改ؓsrc/java?br /> [4]<outputDirectory>Q该元素指定了编译后的class文g的放|目录。默认gؓtarget/classesQ此处未作改变?br /> [5]<resources> <resource>Q该元素指定了Java源文件用的资源文g的存攄录。默认gؓsrc/main/resourcesQ此处修改ؓsrc/java。由于在~码Java源文件时QMaven会将资源路径中的文g全部拯到classes目录。而此时将Java资源文g目录与Java源文件目录,讄为同一目录Q所以需要将.java文g排除在资源文件的范畴之外( <exclude>**/*.java</exclude> )?br /> [6] <testSourceDirectory>Q该元素指定了单元测试Java源文件的攄目录。默认gؓsrc/test/javaQ此处未作修攏V?br /> [7] <testOutputDirectory>Q该元素指定了单元测试Java源文件编译后的class文g攄目录。默认gؓ target/test-classesQ此处未作改变?br /> [8] <testResources> <testResource>Q该元素指定了单元测试Java源文件所使用的资源文件的攄目录。默认gؓsrc/test/resourcesQ此处修改ؓ src/test/java。ƈ且也做了?/span> 讄<resources> <resource>时相同的处理(排除Java源文??br />     通过上述讄后,可以拥有一个定制的Maven工程目录l构了?br />
4 demo-web工程
demo-web工程是整个应用最l的目标输出Q因为此处的目的是制作一个war文gQ然后将它部|到JBoss服务器中。与demo-app工程相比Qdemo-web工程的POM文g主要有如下不同内容:
<project >
    ......
    <build>
        ......
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>
2.0.1 </version>
                <configuration>
                    <webappDirectory>target/${artifactId}</webappDirectory>
                    <warSourceDirectory>src/webapp</warSourceDirectory>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>jboss-maven-plugin</artifactId>
                <version>
1.3.1 </version>
                <configuration>
                    <jbossHome>E:/jboss-
4.0.2 </jbossHome>
                    <serverName>default</serverName>
                    <fileName>
                        ${project.build.directory}/${project.build.finalName}.${project.packaging}
                    </fileName>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
可以看出不同之处在于对maven-war-plguin及jboss-maven-plugin插g的配|与使用?br />     Maven使用maven-war-plugin插g对Web工程制作war文g。由于本文用了定制目录l构Q这样则会maven-war-plugin无法扑ֈWeb工程的Web Root目录(默认是src/main/webapp)Q所以需要对该插件进行适当地配|?lt;warSourceDirectory>是Web工程的Web Root目录Q此处设|ؓQ?lt;webappDirectory>是制作war文g之前Q相当于是一个被打开(exploded)的war文g的根目录(默认是target/artifactId-version)?br />     该工E的脚本中,q用了一个JBoss插g。该插g可以制作好的war文g部v(实质上是拯)到指定的JBoss部v目录中?lt;jbossHome>是JBoss的安装根目录Q?lt;serverName>指JBoss Server的名Uͼ<fileName>是被部vwar文g的名U?br />
参考资?/strong>
[1]Maven入门--概念与实? http://www.tkk7.com/jiangshachina/archive/2006/09/01/67080.html
[2]Maven + Continuum Weed. http://www.tkk7.com/jiangshachina/archive/2006/09/11/68944.aspx
[3]Maven POM Reference. http://maven.apache.org/pom.html
[3]db4o. http://www.db4objects.com
本文实例下蝲地址--http://www.tkk7.com/files/jiangshachina/mvn-demo.rar



Sha Jiang 2006-12-12 18:03 发表评论
]]>
Maven插g使用攉(?http://www.tkk7.com/jiangshachina/archive/2006/11/24/83331.htmlSha JiangSha JiangFri, 24 Nov 2006 09:50:00 GMThttp://www.tkk7.com/jiangshachina/archive/2006/11/24/83331.htmlhttp://www.tkk7.com/jiangshachina/comments/83331.htmlhttp://www.tkk7.com/jiangshachina/archive/2006/11/24/83331.html#Feedback1http://www.tkk7.com/jiangshachina/comments/commentRss/83331.htmlhttp://www.tkk7.com/jiangshachina/services/trackbacks/83331.html Maven插g使用攉
本文是Maven常用插g的收集,对于较复杂的使用会给出实例。每个插仉以groupId:artifactId的Ş式列出。但本文主要x非Maven官方理插gQ如codehause.org的插件。不断更C...(2007.02.13最后更?

org.codehaus.mojo:dependency-maven-plugin
该插件用于对工程依赖的artifactq行处理Q如所有被依赖的artifact拯到指定目录?br /> 注意Q还有一个类似功能的插g--
maven:maven-dependency-pluginQ但安装它之后,在addPlugin时抛NullPointerException(误Maven+Continuum Weed中的主题当加载插件时?/font>NullPointerException)?/font>

org.codehaus.mojo:jboss-maven-plugin
该插件可以将Web工程部v到指定的JBoss服务器中。目前只会?font color="#0000ff">jboss:harddeployQ所谓的部|就是将做好的war文g
直接copy到JBoss deploy目录?/font> 。所以用该goal之前Q需要先制作好war文g?br /> 而对于该插g提供?font color="#0000ff">jboss:deployQ?font color="#0000ff">jboss:startQ?font color="#0000ff">jboss:stop
...{等goalq没有用成功?br />
org.codehaus.mojo:tomcat-maven-plugin
该插件可以将Web工程部v到指定的Tomcat服务器中。它不仅可以部vwar文gQ还可以部v被打开的war目录?br /> 注:该插件目前没有提供下载?br />
mojo.codehaus.org:minijar-maven-plugin

mojo.codehaus.org: exec-maven-plugin

updating....


Sha Jiang 2006-11-24 17:50 发表评论
]]>Maven Weed(?http://www.tkk7.com/jiangshachina/archive/2006/09/11/68944.htmlSha JiangSha JiangMon, 11 Sep 2006 05:37:00 GMThttp://www.tkk7.com/jiangshachina/archive/2006/09/11/68944.htmlhttp://www.tkk7.com/jiangshachina/comments/68944.htmlhttp://www.tkk7.com/jiangshachina/archive/2006/09/11/68944.html#Feedback34http://www.tkk7.com/jiangshachina/comments/commentRss/68944.htmlhttp://www.tkk7.com/jiangshachina/services/trackbacks/68944.html Maven Weed
学习、用Maven的过E中Q亲w遇到或看到的一些问题的解决Ҏ。Maven有不BugQ大家用时一定要心?2007.02.10最后更?

向本C库安装文?/strong>
    mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>
-DgeneratePom=true -DcreateChecksum=true(需要用maven-install-plugin 2.2-SNAPSHOT)

打包Ӟ不在META-INF中生成maven目录
    使用Maven打包(mvn package)Ӟ默认C在META-INF中生成一个目录mavenQ里面是一个pom和一个属性文件。如果不想生成这个目录,需要在POM中进行如下配|:
以对于一般应用程序打包,卛_作jar包ؓ?br />
<build>
 
<plugins>
   
<plugin>
     
<groupId>org.apache.maven.plugins</groupId>
     
<artifactId>maven-jar-plugin</artifactId>
     
<configuration>
       
<archive>
         
<addMavenDescriptor>false</addMavenDescriptor>
       
</archive>
     
</configuration>
   
</plugin>
 
</plugins>
</build>
如果你在打jar包(mvn packageQ时Q报如下错误Q?br />
[INFO] Failed to configure plugin parameters for: org.apache.maven.plugins:maven-jar-plugin:2.0
Cause: Cannot find setter nor field in org.apache.maven.archiver.MavenArchiveConfiguration  for 'addMavenDescriptor' 
q是׃maven-jar-plugin的版本不够高Q很可能?.0版本Q,需要升U到最新的2.1版本。运行命?font color="#0000ff">mvn -U package
Q会先下载最新版本,再执行打包操作?br />     cM的,对于制作warQear包,只需要将artifactId换成对应的pluginQ?/font> maven-war-plugin Q?/span> maven-ear-plugin Q就可以了?br />
Javadoc中文q
    中文操作pȝ中,JDK1.5.0的Javadoc自动默认支持中文Q而且面中的条目名也都默认ؓ中文昄Q在之前的JDK中,q些条目名都默认文)?/font> 如是在这U情况下使用命omvn javadoc:javadoc生成JavadocQ则q些条目名将成ؓq?br />     解决ҎQ让javadoc插g使用UTF16或Unicode字符集。具体配|的形式如下Q?br />
<build>
 
<plugins>
   
<plugin>
      
<groupId>org.apache.maven.plugins</groupId>
      
<artifactId>maven-javadoc-plugin</artifactId>
      
<configuration>
        
<charset>UTF16</charset>
      
</configuration>
    
</plugin>
 
</plugins>
</build>

Scope
Scope表示了某个依赖关pȝ适用范围(作用?Q共?个scope?br /> compile: 默认的适用范围Q表C依赖关系要应用于所有的classpath?br /> provided: 该适用范围非常像compile适用范围。但它表C依赖关系已经由JDK或某个容量提供,如javax.servlet?br /> runtimeQ表C依赖关系不用于编译阶D,而只使用于运行时阶段Q如apache jakarta commons?br /> testQ表C依赖关系q不用于实际的应用程序本w,而是该应用的试E序的编译与q行Q如junit?br /> systemQ该依赖关系cM于providedQ但必须昄地表C是哪一个容器提供了q个artifact。无法在仓库中找到该artifact?br /> 注意Q?br /> [1]hcompile或runtime适用范围的依赖关pM的jar文gQ制作war文g时将会被攑օWEB-INF/lib目录中?br /> [2]不推荐用system适用范围?br />
mvn.bat配置为Eclipse外部工具
Z能够在Eclipse环境中运行mvn.batQ需要将它配|ؓ一个外部工?external tool)。在我的Eclipse Weed(配置外部工具)一文中已经提到了如何配|Eclipse External Tools(可先参见该文)。本主题具体讲q如何将mvn.bat的package Build周期短语配置为外部工兗?br /> [1]主菜?font color="#006400">Run-->External Tools-->External Tools...

[2]先选中Program,再点d上角?font color="#006400">New launch configuration
按钮
[3]Name文本框中输入该外部工L名称“MvnPackage”
[4]通过Browser File System...按钮Q向Location文本框中输入mvn.bat文g的绝对\?br /> [5]通过Variables...按钮Q选择project_locQ将?font color="#006400">Working Directory文本框中输入${project_loc}
[6]?font color="#006400">Augments文本域中输入package
q样当你选中一个pom.xml文g后,再运行该外部工具Q就相当于对该POM文g文g执行mvn package命o?br />
制作war文gӞqo文g
使用maven-war-plugin制作war文gӞ它会先将所?strong>可能
用于制作war的内Ҏ?font color="#0000ff">target/artifactId-version目录(标准目录l构)下,然后再将q些文gq行打包。这样就有两U方法进行文件过滤:[1]使期望被qo的文件一开始就不被攑օ target/artifactId-version目录Q即使它成ؓ不可?/strong>的文Ӟ[2]在制作war文gӞ不将期望被过滤的文g加入包中?/font>
[1]实现W一U方法,要对dependencyq行配置。将不希望加入包的artifact攑օexclusion参数中,如下脚本所C:
<dependency>
    
<groupId>commons-configuration</groupId>
    
<artifactId>commons-configuration</artifactId>
    
<exclusions>
        
<exclusion>
            
<groupId>dom4j</groupId>
            
<artifactId>dom4j</artifactId>
        
</exclusion>
    
</exclusions>
</dependency>
[2]实现W二U方法,要对maven-war-pluginq行配置Q将
不希望加入包的资源文?不再UC为artifact)攑օwarSourceExcludes参数中,如下脚本所C:
<build>
    
<plugins>
        
<plugin>
            
<groupId>org.apache.maven.plugins</groupId>
            
<artifactId>maven-war-plugin</artifactId>
            
<version>2.0.1</version>
            
<configuration>
                
<warSourceExcludes>WEB-INF/lib/dom4j-1.4.jar</warSourceExcludes>
            
</configuration>
        
</plugin>
    
</plugins>
</build>
注意Q上q方法都不仅仅是qo掉dom4j的jar文gQ它q会qo掉dom4j所依赖的其它文?artifact)?br />
当加载插件时抛NullPointerException
如果仓库中有某个插g的jar文g有问题,则会抛出q样的异常。遇到这L问题Ӟ必须这个有问题的插件清除?br /> 可以在执行参C加上-X(?font color="#0000ff">mvn -X compile
)来获得加载插件的q程Q从中可能会发现问题插g。如果还不行Q则使用一个新的仓库,再次执行工程?br />
Install或Deploy源代?/strong>
<project>
    <build>
        <plugins>
            <plugin>
                <inherited>true</inherited>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <executions>
                    <execution>
                        <id>attach-sources</id>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
使用如上的脚本即可,但该脚本只能针对jar文gQ而不能针对war或ear...文g?font size="-0">maven-source-pluginq没有提供install或deploy Web工程源代码的goal?/span>


在命令行中设|本C?/strong>
在用Maven2命o(mvn)Ӟ可以讄本地仓库的\径,该\径将会替?font color="#0000ff">settings.xml
中设|的本地仓库路径?br /> 如命令,mvn -Dmaven.repo.local=Another_Local_Repo package
注:在Maven1中还可以通过-Dmaven.repo.remote讄q程仓库Q但目前在Maven2中还不行?br />
在Maven发行包中扑ֈSuper POM文g
所有的POM都默认承Super POMQ该POM定义了Maven标准目录l构。但在Maven的发行包中,q个Super POM是存攑֜了哪里呢Q?br /> q个POM存攑֜maven-project的jar文g中。在W者的机器中,该Super POM的位|是Q?br /> Maven_Home/lib/maven-project-2.0.4.jar/org/apache/maven/project/pom-4.0.0.xml

构徏Mavenq程仓库
构徏Mavenq程仓库的方法很多,也很单。常用的Web服务?ApacheQJBossQTomcatQ?..)都可以用于构建Mavenq程仓库Q而发布artifactӞ也可以用多U协?FTPQSFTPQSSHQ?..)?br /> 此处使用RedHat AS 4.0 + Apache2.0.59Qƈ应用SSH协议向远E仓库发布artifact?br /> [1]在Apache的DocumnetRoot中新建目录maven2/repoQ此处该目录的绝对\径ؓ
/usr/local/apache2/htdocs/maven2/repo
[2]在本地Maven的settings.xml文g中设|ServerQ语句的形式如下Q?br /> <servers>
  <server>
    <id>myrepo</id>
    <username>myuser</username>
    <password>mypasswd</password>
  </server>
</servers>
myuser/mypasswd是登录远ELinuxpȝ时用的用户?密码?br /> [3]在本地工E的pom.xml中进行如下Ş式的讄Q?br /> <distributionManagement>
    <repository>
        <id>myrepo</id>
        <url>scp://Host/usr/local/apache2/htdocs/maven2/repo</url>
    </repository>
</distributionManagement>
此处id必须与前面设|的server中的id一_scp是用SSH协议的文件传输命令;Host是远ELinux服务器的IP地址或域名;/usr/local/apache2/htdocs/maven2/repo是Maven仓库在远E服务器中的l对路径?br /> [4]在本C使用命omvn deploy发布artifact到远E仓库中?br /> [5]
启动Apache服务器, 通过地址http://Host/maven2/repoQ就可以看到刚刚发布artifact了?br />
updating...


Sha Jiang 2006-09-11 13:37 发表评论
]]>
Continuum入门--实例(?http://www.tkk7.com/jiangshachina/archive/2006/09/09/68680.htmlSha JiangSha JiangSat, 09 Sep 2006 03:32:00 GMThttp://www.tkk7.com/jiangshachina/archive/2006/09/09/68680.htmlhttp://www.tkk7.com/jiangshachina/comments/68680.htmlhttp://www.tkk7.com/jiangshachina/archive/2006/09/09/68680.html#Feedback10http://www.tkk7.com/jiangshachina/comments/commentRss/68680.htmlhttp://www.tkk7.com/jiangshachina/services/trackbacks/68680.htmlContinuum入门--实例     本文虽然是Continuum的入门,但ƈ不涉及Continuum的历双Ӏ下载与安装Q这些内容可以到 Continuum的官方网?/font> (http://maven.apache.org/continuum/) 上了解。本文主要是以一个实例来阐述使用 Continuum的基本方法,而其中将使用的Maven工程是《Maven入门--概念与实例》中的实例(该文末有下蝲链接Q?br />注:转蝲时请注明原作?jiangshachina)及出?http://www.tkk7.com/jiangshachina)Q?/span>

1 使用持箋集成的好?/strong>
1.1 较早提交Q经常提?/strong>
    当开发者有规律性地提交文gӞ持箋集成是最高效的。这是意味着Q不能提交不完全的代码,而是保持每次的改动不大,q且有很好的试。这可以更好地发现代码中的错误?br />1.2 可能频J的构徏
    频繁的Build可能要受到需要进行Build的工作量Q以及进行Build工作的机器的性能的媄响。但频繁的Build实可以在开发h员{UL意力之前Q尽可能早的发现错误。Q何时候,M一个提交的发生QContinuum都可以触发一个Build工作。这意味着Q这些Build工作应该更快Q对于大量的Build工作或性能试
1.3 创徏一个稳定的环境
    如果该Build不是其它开发,试或品环境中的一员,那么可以避免定制JDK或其它的本地讄。如果在持箋集成环境中,一个Build工作p|了,它会被从引v它的原因的修改中隔离出来Q可以独立于q行环境来被使用?br />1.4 q行q净的构?/strong>
    快速、重复地构徏是十分有用的Q同样重要的是,不会׃旧的Build状态而发生失败的Build工作。有规律的考虑问题Q就能得到干净的构建。Continuum默认是q行q净的Build工作Q未来它q可以允许开发者根据所选的旉表去h一个初始的checkout?br />2 实例
2.1 构想
    本实例中需要持l集成的Maven工程?strong>《Maven入门--概念与实例?/strong>中的Demo。用的SCM是SubversionQ即假定已经安装好了Subversion服务器和命o行客L。我们的目标是用Continuum对Maven工程demoQ包括它的子工程Q进行定时的持箋集成。在本文的环境中有如下\径:
    Continuum_Home=D:\continuum
    SVN_Repoitory=E:\svn-repo\repository
    Maven_Demo=D:\maven\demo
    Continuum_Maven=D:\maven\continuum
  // 该目录存放从Subversion下蝲的Maven Demo工程
2.2 初始化Subversion仓库
    生成仓库Q?font color="#0000ff">svnadmin create SVN_Repository

    Maven_Demo中的文g导入C库:
        svn import Maven_Demo file:///SVN_Repoitory/demo -m "initial import demo"
    重新下蝲仓库中的文g(在目录Continuum_Maven中运行如下命?Q?br />        svn checkout file:///SVN_Repoitory/demo demo
2.3 启动Continuum
    假设此时已经安装了ContinuumQ但q没有运行它。要q行ContinuumQ可以双?font color="#0000ff">Continuum_Home\bin\win32\run.bat
文g。对于第一ơ运行,会报一些错误:
……
WARN  RDBMS - Error initialising derby schema : Schema 'SA' does not exist
ERROR 42Y07: Schema 'SA' does not exist
……
q种情况是正常的Q因为Continuum后台使用的是Apache Derby数据库,在第一ơ运行之前,Continuum所需要的一些表和数据ƈ不存在。但Continuum会初始化q些数据Q当W?ơ启动ContinuumӞq些错误׃会出C?br />    Continuum服务器默认?080端口Q如果之前该端口已被占用了,那么启动失败。ؓ了解册个问题,我们需要修改jar文gContinuum_Home\apps\continuum-plexus-application-1.0.3.jar中的\conf\application.xml文g。在该文件中查找8080(该值是唯一?Q将改它Z所指定的端口|本文是?strong>8081
。经q上q过E后QContinuum服务器应该就可以正常启动了。下面将讨论Continuum的初始化配置?br />2.4 初始化配|?/strong>
    在浏览器中用地址http://localhost:8081/continuumdContinuum控制台界面,如下图所C?br />Continuum01.gif
W一ơ登录Continuum后,需要进行一些配|。主要包括用户名/密码Q工作区目录QBuild输出目录以及公司信息。主要参数值如下所C:
    Working Directory=D:\continuum\workspace 
    Build Output Directory=D:\continuum\workspace\output
    Base URL=http://localhost:8081/continuum/servlet/continuum
    // q里的Company信息借用此Blog站点的信息吧 *_*
    Company Name=BlogJava
    Company Logo=http://www.tkk7.com/images/logo.gif
    Company URL=http://www.tkk7.com/
 
提交之后会出现如下画面(能够看到BlogJava的logo?*_*Q?br />Continuum02.gif
使用初始配置时设|的用户名及密码Q就可以dContinuum控制C?br />2.5 修改POM文g
    在目?em>Continuum_Maven中执行如下命令,Maven工程demo重新下蝲一?br />        svn checkout file:///SVN_Repository/demo demo
Z能被Continuum使用Q且能与Subversionq行配合Q需要对原来Maven工程中的POM文gq行修改。在每个POM中加入如下Ş式的语句Q?br />
<project>
  ……
  
<ciManagement>
      
<system>Continuum</system>
      
<url>http://localhost:8081/continuum/servlet/continuum</url>
    
<notifiers>
        
<notifier>
          
<type>mail</type>
        
<address>jiangshachina@163.com</address>
      
</notifier>
    
</notifiers>
  
</ciManagement>
   
  
<scm>
    
<connection>scm:svn:file://localhost/SVN_Repository/ProjectName</connection>
  
</scm>
  ……
</project>
其中ProjectName要与POM当前所在工E名一_如对于demo目录中的POMQ?em>ProjectName是demo。这三个文g修改完毕之后Q将它们都提交到Subversion服务器中Q在各个POM的当前目?/strong>下执行命令:
    svn commit pom.xml -m "my settings"
Z每个工程都可以被单独地运行,需要将整个demo及其子工E都安装到Maven仓库中,仅需要在Maven_Demo 目录下执行命令:
    mvn install
2.6 dMaven工程
    d到Continuum控制台后Q点d?#8220;Add Project”l中?#8220;Maven 2.0+ Project”。添加Maven2工程有两U情况:输入POM文g的URLQ直接上传POM文g。前者适用于Q何Maven工程Q后者只能适用于没有moduleQ即无子工程的Maven工程。由于本文用的Maven工程demo中有两个子工E,所以只能用前一U方法?br />
Continuum03.gif
    只需要加载顶层工E的POM文gQContinuum会自动加载其它moudel的POM文g。如上图所C,在M2 POM Url中输入:
        file:///D:/maven/continuum/Demo/pom.xml

提交之后会看到如下的画面Q即表示Maven工程已经被正地加蝲到Continuum中了?br />Continuum04.gif
    加蝲工程ӞContinuum会将q些工程分别下蝲?strong>Working Directory
Q见2.4节)中,q在 Build Output DirectoryQ见2.4节)中ؓ每个工程 生成一个输出目录(开始只有一些log文gQ。细心的朋友可能会发玎ͼ当上q工作完成之后,子工E?#8220;CE Maven Demo – App”?#8220;CE Maven Demo – WebApp”的Build状态仍然是“Queued Build”。其实这是Continuum的一个Bug!Continnum在许多情况下不会自动h面Q需要手动刷斎ͼ即点?#8220;Show projects”按钮?strong>但请不要使用览器中的refresh按钮Q这样可能会重新提交你的h?/strong>q个Bug在Continuum1.1中被修复。当面h之后QApp和WebApp的Build状态将与Demo工程一致?br />2.7 W一ơBuild
    要BuildM一个Maven工程都十分简单,只需要点L个工E右?#8220;Build Now”按钮可以Build该工E了。如我们点击demo工程对应?#8220;Build Now”按钮Q那么Continuum按照demo中的POM文g执行Build工作。当Build完成后,可以昄本次Build的结果状态:成功Q失败或错误(但请随时手动h面^_^)。而Buildơ数也将?改变??br />Continuum09.gif
    点击上图表格中的?#8220;Build”中的数字Q将可以看到本次Build的详l过E,如下图所C?br />continuum10.gif
2.8 讄旉?/strong>
    前面已经谈过Q持l集成就需要进行有规律的Build。即需要徏立一个时间表Q让持箋集成服务器按照这个表q行Build。Continuum默认的时间表为:每天的每一个整点进行一ơBuildQ即每天每隔一时Build一ơ。我们也可以建立自己的时间表。点击Administrationl中?#8220;Schedules”按钮可以发现当前默认用的旉表,再点?#8220;Add”按钮可以添加新的时间表了,如下图所C?br />Continuum06.gif
    q些参数中最关键的是Cron ExpressionQ它定义了Continuum执行Build的时间规则,它的语法规则误参加资源[4]。上图中规定的时间表是:在每天的14:00-14:59之间Q每分钟都要q行一ơBuild。勾选上Enable复选框之后Q再提交Q该Schedule可以被使用了?br />    Z使用新徏的ScheduleQ我们需要进入工E视N面。点?#8220;Show Projects”-->工程?如CE Maven Demo)Q就可以看到该工E的详细信息Q如下图所C?br />Continuum07.gif
    在工E视囄Build Definitions的Goals中可以发玎ͼ使用的Schedule是“DEFAULT_SCHEDULE”旉表。再点击“Add”按钮Qƈ在Schedule下拉列表框中Q请选择刚刚新徏?#8220;My First Schedule”旉?如下图所C?Q最后再提交后,新的旉表将被采用?br />Continuum08.gif
4 结
    Ҏ前面的描qͼ应该可以对Continuum的用有些感性上的认识了。由于Continuum是Maven的子目Q它内置支持Maven2Q所以能够与Mavenq行良好的集成用。现ӞContinuum也能够支持Ant与Shell脚本工程。用Continuum+MavenQ能够对工程q行q净与频J的集成Q可以提高Build效率q能促进工程的健康发展?br />5 参数资源
[1]Continuum官方|站. http://maven.apache.org/continuum/
[2]Continuum的参考文? http://maven.apache.org/continuum/guides/index.html
[3]Better Build with Maven. http://www.mergere.com/m2book_download.jsp
[4]Cron Expression语法规则. http://www.opensymphony.com/quartz/api/org/quartz/CronTrigger.html


Sha Jiang 2006-09-09 11:32 发表评论
]]>
Maven入门--概念与实??http://www.tkk7.com/jiangshachina/archive/2006/09/01/67080.htmlSha JiangSha JiangFri, 01 Sep 2006 05:43:00 GMThttp://www.tkk7.com/jiangshachina/archive/2006/09/01/67080.htmlhttp://www.tkk7.com/jiangshachina/comments/67080.htmlhttp://www.tkk7.com/jiangshachina/archive/2006/09/01/67080.html#Feedback21http://www.tkk7.com/jiangshachina/comments/commentRss/67080.htmlhttp://www.tkk7.com/jiangshachina/services/trackbacks/67080.htmlMaven入门--概念与实?/strong>
    最q由于工作原因在研究、应用MavenQ有了一些体会就写成了此文。本文虽然是Maven2的入门文章,但ƈ不涉及Maven的历双Ӏ下载与安装Q这些内容可以到Maven的官方网站上了解。本文主要是xMaven中的重要概念Qƈ以一个实例来阐述使用Maven的基本方法?strong>文末有例子代码下载的链接
?2007.01.02最后更?
注:转蝲时请注明原作?jiangshachina)及出?http://www.tkk7.com/jiangshachina)Q?/span>

1 关键名词

    ProjectQQ何您想build的事物,Maven都可以认为它们是工程。这些工E被定义为工E对象模?POMQPoject Object Model)。一个工E可以依赖其它的工程Q一个工E也可以由多个子工程构成?br />     POMQPOM(pom.xml)是Maven的核心文Ӟ它是指示Maven如何工作的元数据文gQ类gAnt中的build.xml文g。POM文g位于每个工程的根目录中?br />     GroupIdQgroupId是一个工E的在全局中唯一的标识符Q一般地Q它是工程名。groupId有利于用一个完全的包名Q将一个工E从其它有类似名U的工程里区别出来?br />     ArtifactQartifact是工E将要生或需要用的文gQ它可以是jar文gQ源文gQ二q制文gQwar文gQ甚xpom文g。每个artifact都由groupId和artifactIdl合的标识符唯一识别。需要被使用(依赖)的artifact都要攑֜仓库(见Repository)中,否则Maven无法扑ֈ(识别)它们?br />     DependencyQؓ了能够build或运行,一个典型的Java工程会依赖其它的包。在Maven中,q些被依赖的包就被称为dependency。dependency一般是其它工程的artifact?br />     Plug-inQMaven是由插gl织的,它的每一个功能都是由插g提供的。插件提供goal(cM于Ant中的target)QƈҎ在POM中找到的元数据去完成工作。主要的Maven插g要是由Java写成的,但它也支持用Beanshell或Ant脚本写成的插件?br />     RepositoryQ仓库用于存放artifactQ它可以是本C库,也可以是q程仓库。Maven有一个默认的q程仓库--centralQ可以从http://www.ibiblio.org/maven2/下蝲其中的artifact。在Windowsq_上,本地仓库的默认地址?font color="#0000ff">User_Home\.m2\repository
?br />     SnapshotQ工E中可以(也应?有一个特D版本,它的版本号包?em>SNAPSHOT字样。该版本可以告诉MavenQ该工程正处于开发阶D,会经常更?但还未发?。当其它工程使用此类型版本的artifactӞMaven会在仓库中寻找该artifact的最新版本,q自动下载、用该最新版?br /> 2 Maven Build Life Cycle
    软g目一般都有相似的开发过E:准备Q编译,试Q打包和部vQMaven上q过E称为Build Life Cycle。在Maven中,q些生命周期׃pd的短语组成,每个短语对应着一?或多?操作Q或对应着一?或多?goal(cM于Ant中的target)?br />     如编译源文g的命?font color="#0000ff">mvn compile中的compile是一个生命周期短语。同时该命o也可以等价于mvn compiler:compileQ其中的compiler是一个插Ӟ它提供了compile(此compile与mvn compile中的compile意义不同)goalQcompilerq可提供另一个goal--testCompileQ该goal用于~译junit试cR?br />     在执行某一个生命周期时QMaven会首先执行该生命周期之前的其它周期。如要执行compileQ那么将首先执行validateQgenerate-sourceQprocess-source和generate-resourcesQ最后再执行compile本n?em>关于Maven中默认的生命周期短语Q请见参考资源[6]中的附录B.3?br /> 3 标准目录布局
    Maven为工E中的源文gQ资源文Ӟ配置文gQ生成的输出和文档都制定了一个标准的目录l构。Maven鼓励使用标准目录布局Q这样就不需要进行额外的配置Q而且有助于各个不同工E之间的联接。当ӞMaven也允许定制个性的目录布局Q这需要进行更多的配置?em>关于Maven的标准目录布局Q请见参考资源[6]中的附录B.1?br /> 4 Maven的优?/font>
    [1]build逻辑可以被重用。在Ant中可能需要多ơ重复地写相同的语句Q但׃POM的承性,可以复用其它的POM文g中的语句。这h可以写出清晰的build语句Q又可以构造出层次关系良好的build工程?br />     [2]不必xbuild工作的实现细节。我们只需要用一些build生命周期短语可以达到我们的目标Q而不必管Maven是如何做到这些的。如Q只需要告诉Maven要安?install)Q那么它自然׃验证Q编译,打包Q及安装?br />     [3]Maven会自动加载工E依赖的artifact所依赖的其它artifact(Transitive Dependency)Q而不用显C的这些artifact全部写到dependency中?br />     [4]如果完全使用Maven的标准目录布局Q那么可以极大地减少配置l节?br /> 5 实例
5.1 构想
    ׃只是阐述Maven的基本用方法,所以本文将要设计的实例Q只是一个简单的Maven demo。该实例包含两个工程Q普通应用程序工E?app)和Web应用工程(webapp)。app工程提供一个简单的Javac;webapp工程只包含一个ServletQƈ用app中的JavacR?br />     该Demo的目标是能够正确地将webapp制成war包,以供部v时用。要能够正确制作warQ自焉先就必须要能够正的~译源代码,且要App模块制成jar包。本文创建的工程所在的目录?font color="#0000ff">D:\maven\demo
?br /> 5.2 App工程
    可以使用Maven的archetype插g来创建新工程Q命令如下:
    D:\maven\demo>mvn archetype:create -DgroupId=ce.demo.mvn -DartifactId=app
该工E的groupId是ce.demo.mvnQ那么该工程的源文g放在Java包ce.demo.mvn中。artifactId是appQ那么该工程根目录的名称ؓapp?br />     当第一ơ执行该命oӞMaven会从central仓库中下载一些文件。这些文件包含插件archetypeQ以及它所依赖的其它包。该命o执行完毕后,在目录D:\maven\demo下会出现如下目录布局Q?br />
app
|-- pom.xml
`-- src
    |-- main
    |   `-- java
    |       `-- ce
    |           `-- demo
    |               `-- mvn
    |                   `-- App.java
    `-- test
        `-- java
            `-- ce
                `-- demo
                    `-- mvn
                        `-- AppTest.java
因本文暂时不涉及JUnit试Q故请将目录app\src\test目录删除(不删除也没关p?^_^)。然后再修改App.java文gQ其完全内容如下Q?br />
package ce.demo.mvn;
public class App {
    
public String getStr(String str) {
        
return str;
    }

}
其实Q如果我们能够清楚地知道Maven的标准目录布局Q就可以不用archetype插g来创建工E原型;如果我们要定制个性的目录布局Q那么就更没有必要用archetype插g了?br /> 5.3 WebApp工程
    我们仍然如创建app工程一样用archetype插g来创建webapp工程Q命令如下:
    D:\maven\demo>mvn archetype:create -DgroupId=ce.demo.mvn -DartifactId=webapp -DarchetypeArtifactId=maven-archetype-webapp
    W一ơ运行此命oӞ也会从central仓库中下载一些与Web应用相关的artifact(如javax.servlet)。此命o与创建app的命令的不同之处是,多设|了一个属性archetypeArtifacttIdQ该属性的gؓmaven-archetype-webapp。即告诉MavenQ将要创建的工程是一个Web应用工程。创建app工程时没有用该属性|是由于archetype默认创徏的是应用E序工程。同LQ执行完该命令之后,会出现如下标准目录布局Q?br />
webapp
|-- pom.xml
`-- src
    `-- main
        `-- webapp
           
|-- index.jsp
            |-- WEB-INF
                `-- web.xml
    Ҏ5.1节的构想Qwebapp工程只包含一个ServletQ所以我们不需要index.jsp文gQ请其删除。此时大家可以发玎ͼ目前的目录布局中ƈ没有放ServletQ即Java源文件的地方。根据参考资源[6]中的附录B.1Q以及app工程中Java源文件的布局Q可以知道ServletQ它仍然是一个JavacLӞ仍然是放?font color="#0000ff">webapp\src\main\java目录中,h目录。此处的Servlet是一个简单HelloServletQ其完整代码如下Q?br />
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工程中的Appc?/span>

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(
"<html><body>");
        out.print(
"<h1>" + str);
        out.print(
"</body></html>");
    }

}
5.4 POM文g
    大家可以发现Q在前面新徏工程Ӟ我们q没有提到各个工E中的pom.xml文g。现在将要讨个问题。我们先看看app工程中的POM文gQ其完整内容如下Q?br />
<project>
  
<modelVersion>4.0.0</modelVersion>
  
<groupId>ce.demo.mvn</groupId>
  
<artifactId>app</artifactId>
  
<packaging>jar</packaging>
  
<version>1.0</version>
  
<name>CE Maven Demo -- App</name>
</project>
    大家可以发现此我帖出来的内容与实际由archetype插g生成的POM文g的内Ҏ些不同,但基本上是一致的。只是ؓ了文g中的语句更清晎ͼ此处删除了一些冗余的内容Qƈ修改了该工程的version和name的|以与此例子的背景来符合。在目前情况下modelVersion值将被固定ؓ4.0.0Q这也是Maven2唯一能够识别的model版本。groupIdQartifactId的g创徏工程时用的命o中的相关属性值是一致的。packaging的值由工程的类型决定,如应用程序工E的packaginggؓjarQWeb应用工程的packaginggؓwar。上q情况也可以从webapp的POM文g中看出,下面看看这个pom的完整内宏V?br />
<project>
  
<modelVersion>4.0.0</modelVersion>
  
<groupId>ce.demo.mvn</groupId>
  
<artifactId>webapp</artifactId>
  
<packaging>war</packaging>
  
<version>1.0</version>
  
<name>CE Maven Demo -- WebApp</name>
  
  
<dependencies>
      
<dependency>
          
<groupId>ce.demo.mvn</groupId>
          
<artifactId>app</artifactId>
          
<version>1.0</version>
      
</dependency>
    
<dependency>
        
<groupId>javax.servlet</groupId>
        
<artifactId>servlet-api</artifactId>
        
<version>2.4</version>
        
<scope>provided</scope>
    
</dependency> 
  
</dependencies>
</project>
    比较app与webapp中的POMQ除前面已经提过的packaging的差别外Q我们还可以发现webapp中的POM多了dependenciesV由于webapp需要用到app工程中的c?见HelloServlet源代?Q它q需要javax.servlet?因ؓ该包q不默认存在于jsdk?。故Q我们必要它们声明到依赖关系中?br /> 5.5 执行
    上述两个工程创徏完毕后,需要执行一些命令来看看会有什么结果出现。我们首先进入app目录Qƈ执行命omvn compileQ然后会在该目录下发现新生成的目录target\classesQ即~译后的class文g(包括它的包目?放在了q里。再执行命omvn packageQ在目录target中就会生成app-1.0.jar文g。该文g的全名由如下形式定Q?strong>artifactId-version.packaging
。根据第2章的叙述可以知道Q执行命?font color="#0000ff">mvn packageӞ首先将产生执行命omvn compile之后的结果,故如果要打包Q那么只需要执?font color="#0000ff">mvn package卛_?br />     在app工程中执行完之后Q就需要进入webapp工程了。进入webapp目录Q此ơ将只执?font color="#0000ff">mvn package命o(隐示地执行了compileq程)。此ơ命令的执行q不成功Q会出现如下问题Q?br />
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)
……
    q体内容可知,Maven正试图从central仓库下蝲app工程的artifactQ但central仓库肯定不会有这个artifactQ其l果只能是执行失?q1章artifact名词的解释可知,被依赖的artifact必须存在于仓?q程或本?中,但目前webapp所依赖的app必不存在于仓库中Q所以执行只能失败?br />     解决q个问题有两U方法:[1]app-1.0.jar安装C库中Q它成Z个artifactQ[2]构徏一个更高层ơ的工程Qapp和webapp成ؓq个工程的子工程Q然后从q个更高层次工程中执行命令?br />     W一U方法比较简单(?/font>http://www.tkk7.com/jiangshachina/admin/EditPosts.aspx中的W一个主?/font>Q,此处详l讨论第2U方??.6??br /> 5.6 更高层次工程
    我们可以app和webapp的上一U目录demo作ؓq两个工E的
一?/font> 更高层次工程Q即使用app和webapp成ؓq个工程的子工程。ؓ了demo目录成ؓ一个demo工程Q只需要在q个目录下添加一个pom.xml文gQ该文g内容如下Q?br />
<project>
    
<modelVersion>4.0.0</modelVersion>
    
<groupId>ce.demo</groupId>
    
<artifactId>mvn-demo</artifactId>
    
<packaging>pom</packaging>
    
<version>1.0</version>
    
<name>CE Maven Demo</name>
    
    
<modules>
        
<module>app</module>
        
<module>webapp</module>
    
</modules>
</project>
    与app和webapp中的POM相比Qdemo的POM使用了modules,modules用于声明本工E的子工E,module中的值对应于子工E的artifact名。而且该POM的packagingcd必须为pom?br />     有了demo工程后,我们只需要在demo目录下执行相兛_令就可以了。通过如下命o卛_验证Q?br />     [1]mvn clean – 消除工程(包括所有子工程)中生的所有输出。这本文的实例中Q实际上是删除target目录。由于之前的操作只有app工程产生了target目录Q而webappq没有,所以将只会删除app工程中的target目录?br />     [2]mvn package – 工E制作成相应的包Qapp工程是作成jar?app-1.0.jar)Qwebapp工程是作成war?webapp-1.0.war)。打开webapp-1.0.war包,可以发现app-1.0.jar被放CWEB-INF的lib目录中?br /> 6 结
    通过以上的叙qC实例Q应该可以对Maven有一个粗略的认识了。用Maven关键是要弄清楚如何写pom.xml文gQ就如同使用Ant要会写build.xml文g一栗在POM中可以直接写入Ant的task脚本Q也可以调用Ant的build.xml文g(推荐)Q所以Maven也可以完成Ant的绝大多数工?但不必安装Ant)。注意:使用Maven׃要再q多的用Ant脚本?br />     利用好Maven的承特性及子工E的关系Q可以很好地化POM文gQƈ能够构徏层次l构良好的工E,有利于工E的l护?br /> 7 参考资?/strong>
[1]Maven官方|站. http://maven.apache.org
[2]Maven POM文g参考结? 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主要插g的列? 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
文中例子E序下蝲Q?a href="http://www.tkk7.com/files/jiangshachina/maven.rar">http://www.tkk7.com/files/jiangshachina/maven.rar

请关注本人的另一关于Maven的文?-Maven入门--较复杂的实例

Sha Jiang 2006-09-01 13:43 发表评论
]]>
վ֩ģ壺 þþøƵ| þþƷ޾Ʒ2020| 99þù뾫Ʒ| 99Ʒһ | ѿavһ| ޾Ʒþ| һ߹ۿƷ| պƵվ| ŷ| 97߹ۿƵ| Ƶһ߹ۿ| ŮڵƵ| պƷרձ| ŷղ| þþƷҹɫav| Ļ޼| ۺϹƷһҳ| Ƶ| ƷþƵ| 69˾ƷƵ| ѿ۳ҹվ| 99ƷƵ߹ۿѲ| 鶹һƷһAVһ| ҹƬ| һ| Ʒþþþþ| vAѾƷ߹ۿ| һa뼺Ӳִѿ51Ʒ | ɫse01Ƶ| պ߲ȫ| ֱ߹ۿƵƵ| שש| 91Ѳˬ˿| ձ˳Ļ| ߿Ƭ| վ߹ۿ| ĻӰѹۿַ| ձɫַ| ۺɫ¶| ˾þô߽ۺͼƬ| þþþþaŷa|