Maven 笔记三 摘录

很多笔记及实例摘录自《Maven权威指南》

可选依赖
    编译这个项目的时候你需要两个依赖类库,但是你不希望在使用你类库的项目中,这两个依赖类库同时作为传递性运行时依赖出现。

<dependency>
      <groupId>net.sf.ehcache</groupId>
      <artifactId>ehcache</artifactId>
      <version>1.4.1</version>
      <optional>true</optional>
</dependency>

 依赖版本界限
    可以指定一个满足给定依赖的版本界限。

<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>[3.8,4.0)</version>
      <scope>test</scope>
</dependency>

  (, )不包含量词        [, ]包含量词
    JUnit <= 3.8.1    [,3.8.1]
传递性依赖 与 冲突解决
  

 <exclusions><exclusion>

 classifier
       如果你要发布同样的代码,但是由于技术原因需要生成两个单独的构件,你就要使用一个分类器(classifier). 例如,如果你想要构建两个单独的构件成JAR,一个使用Java 1.4编译器,另一个使用Java 6编译器,它们有同样的groupId:artifactId:version组合。

项目继承

指定parent-a的POM的相对位置

<parent>
        <groupId>org.sonatype.mavenbook</groupId>
        <artifactId>a-parent</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../a-parent/pom.xml</relativePath>
</parent> 

 过滤资源

<build>
	  <filters>
		<filter>src/main/filters/default.properties</filter>
	  </filters>
	  <resources>
		<resource>
		  <directory>src/main/resources</directory>
		  <filtering>true</filtering>
		</resource>
	  </resources>
</build>

 配置额外的资源目录

<build> 
	  <resources>
		<resource>
		  <directory>src/main/images</directory>
		</resource>
	  </resources> 
</build>

 过滤脚本资源

<resources>
		<resource>
		  <filtering>true</filtering>
		  <directory>/usr/local/xxx
		  <includes>
			<include>run.bat</include>
			<include>run.sh</include>
		  </includes>
		  <targetPath>/usr/xxxx
		</resource>
		<resource>
		  <directory>/usr/local/xxxx
		</resource>
</resources>

 初始的站点描述符

<project name="Sample Project">
  <bannerLeft>
    <name>Sonatype</name>
    <src>images/logo.png</src>
    <href>http://www.sonatype.com</href>
  </bannerLeft>
  <body>
    <menu name="Sample Project">
      <item name="Overview" href="index.html"/>     
    </menu>
    <menu ref="reports"/>
  </body>
</project>

 
给站点描述符添加Banner Left和Banner Right

<project name="Sample Project">
  <bannerLeft>
    <name>Left Banner</name>
    <src>images/banner-left.png</src>
    <href>http://www.xxx.com</href>
  </bannerLeft>
 
  <bannerRight>
    <name>Right Banner</name>
    <src>images/banner-right.png</src>
    <href>http://www.xxx.com</href>
  </bannerRight>
  ...
</project>

 配置发布日期格式

<project name="Sample Project">
  ...
  <publishDate position="navigation-bottom" format="yyyy-MM-dd"/>
  ...
</project>

 Maven套件

<pluginManagement>
      <plugins>
        <plugin>
          <artifactId>maven-assembly-plugin</artifactId>
          <version>2.2-beta-2</version>
          <executions>
            <execution>
              <id>create-project-bundle</id>
              <phase>package</phase>
              <goals>
                <goal>single</goal>
              </goals>
              <configuration>
                <descriptorRefs>
                  <descriptorRef>project</descriptorRef>
                </descriptorRefs>
              </configuration>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </pluginManagement>
    
    <plugins>
        <plugin>
          <artifactId>maven-assembly-plugin</artifactId>
        </plugin>
      </plugins> 

     Assembly插件原生支持多种归档格式jar
        zip,tar,bzip2,gzip,tar.gz,tar.bz2,rar,war,ear,sar,dir
    <assembly>
      <id>bundle</id>
      <formats>
        <format>zip</format>
      </formats>
      ...
    </assembly>
    
files套件
        files元素是套件描述符中最简单的部分,它被设计成定义那些相对与你项目目录的路径。
        使用该元素,你就可以完全控制哪些文件被包含到你的套件中,它们如何被命名,以及它们在归档中的位置。      

 <files>
            <file>
              <source>target/my-app-1.0.jar</source>
              <outputDirectory>lib</outputDirectory>
              <destName>my-app.jar</destName>
              <fileMode>0644</fileMode>
            </file>
</files>

 ”会将你项目的JAR文件包含到套件的lib/目录下,同时除去了文件名的版本部分,使最终的文件名为my-app.jar。
    该描述符会让这个JAR文件对于所有人可读,对于拥有者可写(这就是0664模式的意思,这里使用了Unix四位十进制数的权限标记)
FileSets 元素    
    fileSets应用于那些相对于你的项目结构有一个明确位置的文件。  

 <fileSets>
        <fileSet>
          <directory>src/main/java</directory>
        </fileSet>
</fileSets>

使用fileSet包含文件   

<assembly>
  ...
  <fileSets>
        <fileSet>
          <directory>src/main/java</directory>
          <outputDirectory>src/main/java</outputDirectory>
          <includes>
            <include>**</include>
          </include>
          <useDefaultExcludes>true</useDefaultExcludes>
          <fileMode>0644</fileMode>
          <directoryMode>0755</directoryMode>
        </fileSet>
      </fileSets>
      “**”表示匹配一个或者多个目录,“*”表示匹配文件名的任一部分,“?”表示匹配文件名中的任意单个字符。
</assembly> 

 dependencySets
    files和fileSets只是处理你项目中的文件,而依赖文件不存在于你的项目中。
    自定义依赖输出目录       

<assembly>
          ...
          <dependencySets>
            <dependencySet>
              <outputDirectory>org.sonatype.mavenbook</outputDirectory>
              <outputFileNameMapping>
                ${module.artifactId}.${module.extension}
              </outputFileNameMapping>
            </dependencySet>
          </dependencySets>
          ...
</assembly>

使用范围来定义依赖组,依赖排除和包含
       

<assembly>
          ...
          <dependencySets>
            <dependencySet>
              <scope>provided</scope>
              <outputDirectory>lib/content-zh</outputDirectory>
            </dependencySet>
            <dependencySet>
              <scope>runtime</scope>
              <outputDirectory>
                webapps/${webContextName}/WEB-INF/lib
              </outputDirectory>
              <excludes>
                <exclude>*:zip</exclude>
              </excludes>
            </dependencySet>
            <dependencySet>
              <scope>runtime</scope>
              <outputDirectory>
                webapps/${webContextName}/resources
              </outputDirectory>
              <includes>
                <include>*:zip</include>
              </includes>
              <unpack>true</unpack>
            </dependencySet>
          </dependencySets>
          ...
</assembly>

     在依赖拆解的时候排除文件   

<asembly>
      ...
      <dependencySets>
        <dependencySet>
          <scope>runtime</scope>
          <outputDirectory>
            webapps/${webContextName}/resources
          </outputDirectory>
          <includes>
            <include>*:zip</include>
          </includes>
          <unpack>true</unpack>
          <unpackOptions>
            <excludes>
              <exclude>**/LICENSE*</exclude>
            </excludes>
          </unpackOptions>
        </dependencySet>
      </dependencySets>
      ...
</assembly>

 使用moduleSet包含和排除模块   

<assembly>
      ...
      <moduleSets>
        <moduleSet>
          <includeSubModules>false</includeSubModules>
          <excludes>
            <exclude>
              com.mycompany.application:secret-sauce
            </exclude>
          </excludes>
          <sources>
            <outputDirectoryMapping>
              ${module.basedir.name}
            </outputDirectoryMapping>
            <excludeSubModuleDirectories>
              false
            </excludeSubModuleDirectories>
            <fileSets>
              <fileSet>
                <directory>/</directory>
                <excludes>
                  <exclude>**/target</exclude>
                </excludes>
              </fileSet>
            </fileSets>
          </sources>
        </moduleSet>
      </moduleSets>
      ...
</assembly>

 在套件中包含模块的JavaDoc  

 <assembly>
      ...
      <moduleSets>
        <moduleSet>
          <binaries>
            <attachmentClassifier>javadoc</attachmentClassifier>
            <includeDependencies>false</includeDependencies>
            <outputDirectory>apidoc-jars</outputDirectory>
          </binaries>
        </moduleSet>
      </moduleSets>
      ...
</assembly>

 在套件中包含模块构件和依赖   

<assembly>
      ...
      <moduleSets>
        <moduleSet>
          <binaries>
            <outputDirectory>
              ${module.artifactId}-${module.version}
            </outputDirectory>
            <dependencySets>
              <dependencySet/>
            </dependencySets>
          </binaries>
        </moduleSet>
      </moduleSets>
      ...
</assembly>

     所有项目的内容就会被打包在一起,然后可以直接解压添加到现存web应用中(为了添加一个扩展特性)。
    然而,如果你的团队构建了很多个web片段项目,那么你就会想要重用该描述符,而非复制它。
    为了将该描述符以构件的形式部署,我们就要将其放到一个项目中,位于src/main/resources/assemblies目录。
    |-- pom.xml
    `-- src
        `-- main
            `-- resources
                `-- assemblies
                    `-- web-fragment.xml
   

<assembly>
      <id>war-fragment</id>
      <formats>
        <format>zip</format>
      </formats>
     <includeBaseDirectory>false</includeBaseDirectory>
      <dependencySets>
        <dependencySet>
          <outputDirectory>WEB-INF/lib</outputDirectory>
        </dependencySet>
      </dependencySets>
      <fileSets>
        <fileSet>
          <directory>src/main/webapp</directory>
          <outputDirectory>/</outputDirectory>
          <excludes>
            <exclude>**/web.xml</exclude>
          </excludes>
        </fileSet>
      </fileSets>
    </assembly>

     默认情况下,Maven会将整个src/main/resources目录打包到最终的jar中,这里,如果没有额外的配置,套件描述符也就会被打包。

猜你喜欢

转载自zhengchao123.iteye.com/blog/1864763
今日推荐