首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

同仁的maven学习笔记

2012-06-30 
同事的maven学习笔记?${pom.project.build.directory} ${project.build.outputDirectory} results in the

同事的maven学习笔记

?

${pom.project.build.directory} ${project.build.outputDirectory} results in the path to your "target/classes" dir ${project.name} refers to the name of the project. ${project.version} refers to the version of the project. ${project.build.finalName} refers to the final name of the file created when the built project is packaged 本地用户设定
所有用的的 settings.xml 中的设定都可以通过 settings. 前缀进行引用 ${settings.localRepository} refers to the path of the user's local repository. ${maven.repo.local} also works for backward compatibility with maven1 ?? 环境变量
系统的环境变量通过 env. 前缀引用 ${env.M2_HOME} returns the Maven2 installation path. ${java.home} specifies the path to the current JRE_HOME environment use with relative paths to get for example:
<jvm>${java.home}../bin/java.exe</jvm> java系统属性
所有JVM中定义的java系统属性. 用户在pom中定义的自定义属性
<dependency>    <groupId>org.hibernate</groupId>    <artifactId>hibernate</artifactId>    <version>3.2.5.ga</version>    <exclusions>      <exclusion>        <groupId>javax.transaction</groupId>        <artifactId>jta</artifactId>      </exclusion>    </exclusions>  </dependency>
1 楼 vivus 2011-01-17   问:我有一些jar文件要依赖,但是我又不想把这些jar去install到mvn的repository中去,怎么做配置?
答:加入一个特殊的依赖关系,使用system类型,如下:

<dependency>
  <groupId>org.operamasks</groupId>
  <artifactId>elite</artifactId>
  <version>0.5.0</version>
  <type>jar</type>
    <scope>system</scope>
    <systemPath>${basedir}/lib/elite.jar</systemPath>
</dependency>
但是要记住,发布的时候不会复制这个jar。需要手工配置,而且其他project依赖这个project的时候,会报告警告。如果没有特殊要求,建议直接注册发布到repository。

问:在eclipse环境中同时使用maven builder和eclipse builder,并且设置项目依赖关系之后,为什么编译会出现artifact找不到错误,但是直接使用命令行mvn构建则一切正常?
答:在project属性中去掉java build path中对其他 project 的依赖关系,直接在pom中设置依赖关系即可

<!-- 依赖的其他项目 -->
  <dependency>
<groupId>com.apusic.bpm</groupId>
<artifactId>apusic-bpm-common</artifactId>
<version>${project.version}</version>
  </dependency>
另外,保证没有其他错误。

问:我想让输出的jar包自动包含所有的依赖
答:使用 assembly 插件即可。

<plugin>
       <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
      </plugin>
问:我的测试用例依赖于其他工程的测试用例,如何设置?
答:maven本身在发布的时候,可以发布单纯的jar,也可以同时发布xxx-tests.jar和xxx-javadoc.jar(大家经常在repository中可以看到类似的东西)。我们自己的项目A要同时输出test.jar可以做如下的设置

<!-- 用于把test代码也做成一个jar -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <executions>
          <execution>
            <goals>
               <goal>test-jar</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
然后在其他需要引用的工程B中做如下的dependency设置

<dependency>
        <groupId>com.apusic.XXX</groupId>
        <artifactId>工程A</artifactId>
        <version>${project.version}</version>
        <type>test-jar</type>
        <scope>test</scope>
    </dependency>
变量
问:如何使用变量替换?项目中的某个配置文件比如jdbc.properties使用了一些pom中的变量,如何在发布中使用包含真实内容的最终结果文件?
答:使用资源过滤功能,比如:

<project>
  ...
  <properties>
    <jdbc.driverClassName>com.mysql.jdbc.Driver</jdbc.driverClassName>
    <jdbc.url>jdbc:mysql://localhost:3306/development_db</jdbc.url>
    <jdbc.username>dev_user</jdbc.username>
    <jdbc.password>s3cr3tw0rd</jdbc.password>
  </properties>
  ...
  <build>
    <resources>
      <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
      </resource>
    </resources>
  </build>
  ...
  <profiles>
    <profile>
      <id>production</id>
      <properties>
        <jdbc.driverClassName>oracle.jdbc.driver.OracleDriver</jdbc.driverClassName>
        <jdbc.url>jdbc:oracle:thin:@proddb01:1521:PROD</jdbc.url>
        <jdbc.username>prod_user</jdbc.username>
        <jdbc.password>s00p3rs3cr3t</jdbc.password>
      </properties>
    </profile>
  </profiles>
</project>
问: maven-svn-revision-number-plugin 插件说明
答: maven-svn-revision-number-plugin 可以从 SVN 中获取版本号,并将其变成环境变量,交由其他插件或者profile使用,详细帮助在这里。一般和resource的filter机制同时使用

<plugins>
            <plugin>
                <groupId>com.google.code.maven-svn-revision-number-plugin</groupId>
                <artifactId>maven-svn-revision-number-plugin</artifactId>
                <version>1.3</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>revision</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <entries>
                        <entry>
                            <prefix>prefix</prefix>
                        </entry>
                    </entries>
                </configuration>
            </plugin>
        </plugins>
这段代码负责把resource文件中的内容替换成适当内容

repository = ${prefix.repository}
path = ${prefix.path}
revision = ${prefix.revision}
mixedRevisions = ${prefix.mixedRevisions}
committedRevision = ${prefix.committedRevision}
status = ${prefix.status}
specialStatus = ${prefix.specialStatus}
编译
问:如何给插件指派参数?比如我要设置一些编译参数
答:以下内容设定编译器编译java1.5的代码

<project>
  ...
  <build>
    ...
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.5</source>
          <target>1.5</target>
        </configuration>
      </plugin>
    </plugins>
    ...
  </build>
  ...
</project>
要设置其他插件的参数也可以,请参考对应插件的帮助信息

问:我的目录是非标准的目录结构,如何设置让maven支持?
答:指定source目录和test-source目录即可。

<build>
    <directory>target</directory>
    <sourceDirectory>src</sourceDirectory>
    <scriptSourceDirectory>js/scripts</scriptSourceDirectory>
    <testSourceDirectory>test</testSourceDirectory>
    <outputDirectory>bin</outputDirectory>
    <testOutputDirectory>bin</testOutputDirectory>
  </build>
这个例子把源代码设置成了src目录,测试代码在test目录,所以输出到bin目录。这里要注意,directory如果也设置成bin目录的话,maven打包的时候会引起死循环,因为directory是所有工作存放的地方,默认包含outputDirectory定义的目录在内。

问:我的项目除了main/java目录之外,还加了其他的c++目录,想要一并编译,如何做?
答:使用native插件,具体配置方法参考http://mojo.codehaus.org/maven-native/native-maven-plugin/

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>native-maven-plugin</artifactId>
    <extensions>true</extensions>
    <configuration>
</plugin>
问:我想要把工程的所有依赖的jar都一起打包,怎么办?
答:首先修改maven的配置文件,给maven-assembly-plugin增加一个jar-with-dependencies的描述。

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>
然后使用命令打包即可: mvn assembly:assembly

问:我想把main/scripts中的内容一起打包发布,如何做?
答:在pom中配置额外的资源目录。如果需要的话,还可以指定资源目录的输出位置

<build>
  ...
  <resources>
    <resource>
      <filtering>true</filtering>
      <directory>src/main/command</directory>
      <includes>
        <include>run.bat</include>
        <include>run.sh</include>
      </includes>
      <targetPath>/abc</targetPath>
    </resource>
    <resource>
      <directory>src/main/scripts</directory>
    </resource>
  </resources>
  ...
</build>
问:我有多个源代码目录,但是maven只支持一个main src和一个test src,怎么版?
答:使用另外一个插件,并仿照如下配置pom

<plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <version>1.1</version>
        <executions>
          <execution>
            <id>add-source</id>
            <phase>generate-sources</phase>
            <goals>
              <goal>add-source</goal>
            </goals>
            <configuration>
              <sources>
                <source>src/config/java</source>
                <source>src/main/java</source>
                <source>src/member/java</source>
              </sources>
            </configuration>
          </execution>
        </executions>
      </plugin>
问:我的源代码目录中有一部分文件我不想让maven编译,怎么做?
答:使用一个maven插件,然后使用includes和excludes。同理,也可以处理资源的过滤。

<build>
  <sourceDirectory>../../src/java</sourceDirectory>
  <plugins>
    <plugin>
      <groupId>com.sun.enterprise</groupId>
      <artifactId>hk2-maven-plugin</artifactId>
      <configuration>
        <includes>
          <include>com/sun/logging/LogDomains.*</include>
          <include>com/sun/enterprise/util/OS.java</include>
          <include>com/sun/enterprise/util/io/FileUtils.java</include>
          <include>com/sun/enterprise/util/zip/**</include>
          <include>com/sun/enterprise/util/i18n/**</include>
          <include>com/sun/enterprise/deployment/backend/IASDeploymentException.java</include>
        </includes>
        <excludes>
          <exclude>com/sun/enterprise/config/ConfigBeansFactory.java</exclude>
          <exclude>com/sun/enterprise/config/clientbeans/**</exclude>
        </excludes>
      </configuration>
    </plugin>
  </plugins>
  <resources>
    <resource>
      <directory>../../src/java</directory>
      <includes>
        <include>**/*.properties</include>
      </includes>
    </resource>
  </resources>
</build>
问:我的项目是一个纯的html组成的项目,没有任何的java代码,怎么跳过编译过程?
答:配置如下

<build>
  <sourceDirectory>src/java</sourceDirectory>
  <plugins>
    <plugin>
    <groupId>com.sun.enterprise</groupId>
    <artifactId>hk2-maven-plugin</artifactId>
    </plugin>
  </plugins>
</build>
问:我的源代码是utf8的编码,怎么设置才能不出编译警告?
答:在pom中添加一个简单的参数,指定一下编码即可

<project>
  ...
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  ...
</project>
以上是官方给出的解决方案,但是经过尝试这样只能影响到resource处理时候的编码,真正有用的是如下配置:

<build>
  ...
    <plugin>
      <artifactId>maven-compiler-plugin</artifactId>
      <configuration>
        <encoding>UTF-8</encoding>
      </configuration>
    </plugin>
  ...
</build>
测试相关
问:如何忽略某个阶段的结果?比如单元测试不一定要全正确
答:给插件增加testFailureIgnore参数,并设置为false。如果要屏蔽该阶段,则用 <skip>true</skip>

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
          <testFailureIgnore>true</testFailureIgnore>
        </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>
问:我如何在maven中加入PMD,CheckStyle,JDepend等检查功能?
答:加入PMD检查,以下代码如果在 reporting 节点中加入则在 mvn site 中执行,如果在 build 节点中加入,则在build的时候自动运行检查。详细配置参考pmd插件使用说明

<plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-pmd-plugin</artifactId>
        <version>2.5</version>
      </plugin>
    </plugins>
加入 checkstyle 检查,详细配置参考checkstyle插件使用说明,同样注意放置在reporting和build节点中的区别(所有报表类插件都要同样注意):

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-checkstyle-plugin</artifactId>
        <version>2.5</version>
      </plugin>
加入 simian 的支持,simian是一个支持代码相似度检查的工具,目前有maven插件,也有checkstyle的插件。它不仅可以检查java,甚至可以支持文本文件的检查。详细帮助信息参考这里。simian 的 maven插件在这里

<build>
         <plugins>
            <plugin>
               <groupId>org.codehaus.mojo</groupId>
               <artifactId>simian-maven-plugin</artifactId>
               <version>1.6.1</version>
            </plugin>
         </plugins>
         ...
      </build>
加入 jdepend 检查,详细配置参考jdepend使用说明,

<plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>jdepend-maven-plugin</artifactId>
        <version>2.0-beta-2</version>
      </plugin>
加入 findbugz 检查,详细配置参考findbugz使用说明,

<plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>findbugs-maven-plugin</artifactId>
        <version>2.0.1</version>
      </plugin>
加入javadoc生成,详细配置参考javadoc usage

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <version>2.7</version>
        <configuration>
          ...
        </configuration>
      </plugin>
加入 jxr 支持,JXR是一个生成java代码交叉引用和源代码的html格式的工具,详细配置信息参考jxr usage。注意,jxr没有必要在build阶段运行。

<reporting>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jxr-plugin</artifactId>
        <version>2.1</version>
      </plugin>
    </plugins>
  </reporting>
加入 Cobertura 支持,它是一个代码覆盖率工具,可以用来评估具有相应测试的源代码的比率。详细帮助在这里。
另外一个功能相似的软件是EMMA,详细的帮助在这里。两个产品的比较文章在这里,个人倾向于都要用,因为给出的指标不一样,都有参考作用。

Cobertura
<plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>cobertura-maven-plugin</artifactId>
        <version>2.4</version>
        <configuration>
          <check>
            <branchRate>85</branchRate>
            <lineRate>85</lineRate>
            <haltOnFailure>true</haltOnFailure>
            <totalBranchRate>85</totalBranchRate>
            <totalLineRate>85</totalLineRate>
            <packageLineRate>85</packageLineRate>
            <packageBranchRate>85</packageBranchRate>
            <regexes>
              <regex>
                <pattern>com.example.reallyimportant.*</pattern>
                <branchRate>90</branchRate>
                <lineRate>80</lineRate>
              </regex>
              <regex>
                <pattern>com.example.boringcode.*</pattern>
                <branchRate>40</branchRate>
                <lineRate>30</lineRate>
              </regex>
            </regexes>
          </check>
        </configuration>
        <executions>
          <execution>
            <goals>
              <goal>clean</goal>
              <goal>check</goal>
            </goals>
          </execution>
        </executions>
      </plugin>EMMA
<reporting>
    ...
    <plugins>
      ...
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>emma-maven-plugin</artifactId>
        <version>1.0-alpha-3-SNAPSHOT</version>
      </plugin>
      ...
    </plugins>
    ...
  </reporting>
添加 javaNCSS 插件,它是一个java代码的度量工具,详细参考在这里。

<reporting>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>javancss-maven-plugin</artifactId>
        <version>2.0-beta-2</version>
      </plugin>
    </plugins>
  </reporting>
profile相关
问:profile能够设置为某个变量不存在的条件下激活?
答:使用!前缀,请看示例:

<activation>
        <property>
          <name>!environment.type</name>
        </property>
      </activation>
部署相关
问:其他部署到服务器的方式和配置怎么配?
答:本文摘自 http://blog.csdn.net/zyxnetxz/archive/2009/05/18/4199348.aspx

Distribution Management
用于配置分发管理,配置相应的产品发布信息,主要用于发布,在执行mvn deploy后表示要发布的位置


配置到文件系统 <distributionManagement>
  <repository>
    <id>proficio-repository<id>
    <name>Proficio Repository<name>
    <url>file://${basedir}/target/deploy<url>
  <repository>
<distributionManagement>
使用ssh2配置 <distributionManagement>
  <repository>
    <id>proficio-repository<id>
    <name>Proficio Repository<name>
    <url>scp://sshserver.yourcompany.com/deploy<url>
  <repository>
<distributionManagement>
使用sftp配置 <distributionManagement>
  <repository>
    <id>proficio-repositoryi<d>
    <name>Proficio Repository<name>
    <url>sftp://ftpserver.yourcompany.com/deploy<url>
  <repository>
<distributionManagement>
使用外在的ssh配置
编译扩展用于指定使用wagon外在ssh提供,用于提供你的文件到相应的远程服务器。 <distributionManagement>
  <repository>
    <id>proficio-repository<id>
    <name>Proficio Repository<name>
    <url>scpexe://sshserver.yourcompany.com/deploy<url>
  <repository>
<distributionManagement>
<build>
  <extensions>
    <extension>
      <groupId>org.apache.maven.wagon<groupId>
      <artifactId>wagon-ssh-external<artifactId>
      <version>1.0-alpha-6<version>
    <extension>
  <extensions>
<build>
使用ftp配置 <distributionManagement>
  <repository>
    <id>proficio-repository<id>
    <name>Proficio Repository<name>
    <url>ftp://ftpserver.yourcompany.com/deploy<url>
  <repository>
<distributionManagement>
<build>
  <extensions>
    <extension>
      <groupId>org.apache.maven.wagongroupId>
      <artifactId>wagon-ftpartifactId>
      <version>1.0-alpha-6version>
    <extension>
  <extensions>
<build>


插件配置
问:我用maven输出site,如何设置输出为utf8编码?
答: 配置site插件的编码设置

...
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-site-plugin</artifactId>
    <version>2.0-beta-6</version>
    <configuration>
      <outputEncoding>UTF-8</outputEncoding>
    </configuration>
  </plugin>
  ...
问:如何在maven中使用ant脚本?
答:使用maven的AntRun插件。

<plugin>
        <artifactId>maven-antrun-plugin</artifactId>
        <executions>
          <execution>
            <phase> <!-- a lifecycle phase --> </phase>
            <configuration>
              <tasks>
                <!-- 这里加入ant的task代码,也就是包含在ant脚本的<target>节点内的代码部分 -->
              </tasks>
            </configuration>
            <goals>
              <goal>run</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
问:如何在ant中使用maven的功能?
答:使用ant的maven task,不过只有ant 1.6以上和jdk 1.5环境才支持。

问:我能用maven支持eclipse RCP项目吗?
答:当然可以,你可以使用插件pde-maven-plugin,详细内容可以参考这里http://www.iteye.com/topic/57840.这篇文章也很有参考作用.

问:我的工程里用hibernate,想在编译时候自动生成ddl,如何做?
答:添加插件 hibernate3-maven-plugin ,按照如下配置:

<plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>hibernate3-maven-plugin</artifactId>
          <version>2.1</version>
          <configuration>
            <components>
              <component>
                <name>hbm2ddl</name>
                <implementation>annotationconfiguration</implementation>
              </component>
            </components>
          </configuration>
          <dependencies>
            <dependency>
              <groupId>hsqldb</groupId>
              <artifactId>hsqldb</artifactId>
              <version>${hsqldb.version}</version>
            </dependency>
          </dependencies>
        </plugin> 2 楼 lanxi221 2011-03-22  
看了这篇文章,觉得楼主知道很多,很羡慕,希望能解答我下面的两个问题。
我想问下,如何用maven实现把项目发布到weblogic上?
maven如何给每次做的build加上一个标签文件,以标注是哪次做的?

非常感谢!

热点排行