<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>绿色记忆 &#187; Maven</title>
	<atom:link href="https://blog.gmem.cc/tag/maven/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.gmem.cc</link>
	<description></description>
	<lastBuildDate>Tue, 21 Apr 2026 10:40:56 +0000</lastBuildDate>
	<language>en-US</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.9.14</generator>
	<item>
		<title>Maven原型系统</title>
		<link>https://blog.gmem.cc/maven-archetypes</link>
		<comments>https://blog.gmem.cc/maven-archetypes#comments</comments>
		<pubDate>Tue, 02 Jul 2019 01:27:30 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Maven]]></category>

		<guid isPermaLink="false">https://blog.gmem.cc/?p=27831</guid>
		<description><![CDATA[<p>简介 原型（Archetype）是Maven的模板工具箱。利用原型，可以很容易的应用组织在软件实现方面的最佳实践，减轻搭建项目框架的负担。 原型机制支持“增量“方式，也就是说，你通过原型生成一个项目后，可以再次用另外一个原型来生成额外的内容到此项目中。这种增量机制允许将项目的不同方面/部分封装到多个原型中，增强可复用、可组合性。 创建项目 从Maven原型创建项目，需要使用maven-archetype-plugin插件。 引用原型仓库 一般情况下Maven原型都存放在远程仓库中，Maven中心仓库默认可用，你也可以修改Maven的settings.xml添加别的原型仓库： [crayon-69e8cfbe36e50902968744/] 选择原型 交互式调用archetype:generate时，maven-archetype-plugin会提示你从某个仓库选择原型，输入对应的序号即可。 过滤原型 使用filter可以减少原型列表的长度： [crayon-69e8cfbe36e57558902475/] 输入配置 选择原型后，maven-archetype-plugin会提示你输入一系列属性的值，最终生成新项目。 属性填充 生成项目时，你需要提供新项目的GAV、package，原型还可能规定了一系列其它必须属性，这些属性会用来： 填充Velocity模板中的变量 如果目录、文件名包含[crayon-69e8cfbe36e5a214100260-i/]，则被替换为对应的属性值 [crayon-69e8cfbe36e5c025214785-i/]被替换为项目的ArtifactId 在多模块项目中，[crayon-69e8cfbe36e5e044168394-i/]被替换为根项目的ArtifactId 开发原型 <a class="read-more" href="https://blog.gmem.cc/maven-archetypes">[...]</a></p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/maven-archetypes">Maven原型系统</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h1"><span class="graybg">简介</span></div>
<p>原型（Archetype）是Maven的模板工具箱。利用原型，可以很容易的应用组织在软件实现方面的最佳实践，减轻搭建项目框架的负担。</p>
<p>原型机制支持“增量“方式，也就是说，你通过原型生成一个项目后，可以<span style="background-color: #c0c0c0;">再次用另外一个原型来生成额外的内容</span>到此项目中。这种增量机制允许将项目的不同方面/部分封装到多个原型中，增强可复用、可组合性。</p>
<div class="blog_h1"><span class="graybg">创建项目</span></div>
<p>从Maven原型创建项目，需要使用maven-archetype-plugin插件。</p>
<div class="blog_h2"><span class="graybg">引用原型仓库</span></div>
<p>一般情况下Maven原型都存放在远程仓库中，Maven中心仓库默认可用，你也可以修改Maven的settings.xml添加别的原型仓库：</p>
<pre class="crayon-plain-tag">&lt;repository&gt;
  &lt;id&gt;archetype&lt;/id&gt;
  &lt;url&gt;https://m2.gmem.cc/path/to/repo/&lt;/url&gt;
&lt;/repository&gt;

&lt;!-- 如果需要身份验证 --&gt;
&lt;server&gt;
  &lt;id&gt;archetype&lt;/id&gt;
  &lt;username&gt;user.name&lt;/username&gt;
  &lt;password&gt;s3cr3t&lt;/password&gt;
&lt;/server&gt;</pre>
<div class="blog_h2"><span class="graybg">选择原型</span></div>
<p>交互式调用archetype:generate时，maven-archetype-plugin会提示你从某个仓库选择原型，输入对应的序号即可。</p>
<div class="blog_h3"><span class="graybg">过滤原型</span></div>
<p>使用filter可以减少原型列表的长度：</p>
<pre class="crayon-plain-tag">mvn archetype:generate -Dfilter=org.apache:struts </pre>
<div class="blog_h2"><span class="graybg">输入配置</span></div>
<p>选择原型后，maven-archetype-plugin会提示你输入一系列属性的值，最终生成新项目。</p>
<div class="blog_h2"><span class="graybg">属性填充</span></div>
<p>生成项目时，你需要提供新项目的GAV、package，原型还可能规定了一系列其它必须属性，这些属性会用来：</p>
<ol>
<li>填充Velocity模板中的变量</li>
<li>如果目录、文件名包含<pre class="crayon-plain-tag">__property__</pre>，则被替换为对应的属性值</li>
<li><pre class="crayon-plain-tag">__artifactId__</pre>被替换为项目的ArtifactId</li>
<li>在多模块项目中，<pre class="crayon-plain-tag">__rootArtifactId__</pre>被替换为根项目的ArtifactId</li>
</ol>
<div class="blog_h1"><span class="graybg">开发原型</span></div>
<p>你可以从零开始，开发一个原型，也可以从现有的项目反向生成原型。</p>
<div class="blog_h2"><span class="graybg">ArchetypeDescriptor</span></div>
<p>原型描述符用于存储原型的元数据，它存放在原型JAR的 META-INF/maven/archetype-metadata.xml中。下面是一个例子：</p>
<pre class="crayon-plain-tag">&lt;archetype-descriptor xmlns="https://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.1.0" 
                      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="https://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.1.0 
                      http://maven.apache.org/xsd/archetype-descriptor-1.1.0.xsd"
  &lt;!-- 原型的名称--&gt;
          &lt;!-- 是否偏原型 --&gt;
  name=.. partial=.. &gt;
  &lt;!-- 用户必须提供的属性列表 --&gt;
  &lt;requiredProperties&gt;
    &lt;requiredProperty key=.. &gt;
      &lt;defaultValue/&gt;
      &lt;validationRegex/&gt;
    &lt;/requiredProperty&gt;
  &lt;/requiredProperties&gt;
 
  &lt;!-- 文件集定义 --&gt;
  &lt;fileSets&gt;
    &lt;!-- 文件集说明了在生成项目的过程中，如何使用原型JAR中的文件 --&gt;
    &lt;!-- filtered 此文件集是否可以被过滤，如果true，则意味着这些文件被用作Velocity模板。否则原样拷贝 --&gt;
    &lt;!-- packaged 此文件集是否应该被生成/拷贝到package属性所指定的目录层次中 --&gt;
    &lt;!-- encoding 文件的编码方式 --&gt;
    &lt;fileSet filtered=.. packaged=.. encoding=.. &gt;
      &lt;directory/&gt; &lt;!-- 此文件集位于的目录 --&gt;
      &lt;includes&gt;&lt;include&gt;&lt;/include&gt;&lt;/includes&gt;  &lt;!-- 包含的文件列表，Ant语法 --&gt;
      &lt;excludes/&gt; &lt;!-- 排除的文件列表，Ant语法 --&gt;
    &lt;/fileSet&gt;
  &lt;/fileSets&gt;
 
  &lt;!-- 模块定义 --&gt;
  &lt;modules&gt;
    &lt;module id=.. dir=.. name=.. &gt;
      &lt;fileSets&gt;
        &lt;fileSet filtered=.. packaged=.. encoding=.. &gt;
          &lt;directory/&gt;
          &lt;includes/&gt;
          &lt;excludes/&gt;
        &lt;/fileSet&gt;
      &lt;/fileSets&gt;
      &lt;!-- 模块可以嵌套 --&gt;
      &lt;modules&gt;
        &lt;module&gt;...recursion...&lt;module&gt;
      &lt;/modules&gt;
    &lt;/module&gt;
  &lt;/modules&gt;
&lt;/archetype-descriptor&gt; </pre>
<p>下面是原型描述符的最小化示例：</p>
<pre class="crayon-plain-tag">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;archetype-descriptor name="basic"&gt;
  &lt;requiredProperties&gt;
    &lt;requiredProperty key="property-with-default"&gt;
      &lt;defaultValue&gt;default-value&lt;/defaultValue&gt;
    &lt;/requiredProperty&gt;
    &lt;requiredProperty key="property-without-default"/&gt;
  &lt;/requiredProperties&gt;
  &lt;fileSets&gt;
    &lt;fileSet filtered="true" packaged="true"&gt;
      &lt;directory&gt;src/main/java&lt;/directory&gt;
      &lt;includes&gt;
        &lt;include&gt;**/*.java&lt;/include&gt;
      &lt;/includes&gt;
    &lt;/fileSet&gt;
  &lt;/fileSets&gt;
&lt;/archetype-descriptor&gt;</pre>
<div class="blog_h2"><span class="graybg">从项目创建</span></div>
<p>本节我们演示一下，如何从一个现有的项目，反向生成原型。</p>
<div class="blog_h3"><span class="graybg">创建示例项目</span></div>
<p>首先创建一个空白的Maven项目：</p>
<pre class="crayon-plain-tag">mvn archetype:generate -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.0 \
    -DgroupId=cc.gmem.study.mvn -DartifactId=archetype-proto -DinteractiveMode=false</pre>
<div class="blog_h3"><span class="graybg">创建原型</span></div>
<p>进入示例项目，生成原型：</p>
<pre class="crayon-plain-tag">cd JavaEE/projects/idea/archetype-study/archetype-proto/
mvn archetype:create-from-project</pre>
<p>如果没有错误，生成的原型项目位于target/generated-sources/archetype目录：</p>
<pre class="crayon-plain-tag">.
└── archetype                                         # 原型项目的根目录
    ├── pom.xml                                       # 原型项目的POM
    ├── src
    │   ├── main
    │   │   └── resources
    │   │       ├── archetype-resources               # 原始项目的所有内容，亦即从此原型生成的项目的所有内容
    │   │       │   ├── __artifactId__.iml
    │   │       │   ├── .idea
    │   │       │   └── src
    │   │       │       └── main
    │   │       │           └── java
    │   │       │               └── App.java          # 注意包结构消失了
    │   │       │   └── pom.xml
    │   │       └── META-INF
    │   │           └── maven
    │   │               └── archetype-metadata.xml    # 原型元数据
    │   └── test
    │       └── resources
    │           └── projects
    │               └── basic
    │                   ├── archetype.properties      # 用于测试原型
    │                   └── goal.txt
    └── target</pre>
<div class="blog_h3"><span class="graybg">排除文件</span></div>
<p>可以看到，上面的例子将原始项目的IDE元数据文件也放入到原型中了，这不是我们期望的，可以使用属性文件排除。</p>
<p>在原始项目中添加属性文件：</p>
<pre class="crayon-plain-tag">excludePatterns=.idea/**</pre>
<p>然后重新生成原型：</p>
<pre class="crayon-plain-tag">mvn clean  archetype:create-from-project -Darchetype.properties=archetype.properties</pre>
<p>可以看到.idea目录被排除掉了。</p>
<div class="blog_h3"><span class="graybg">消失的包前缀</span></div>
<p>从上面的例子还可以看到，生成的原型项目中App.java的包消失了。</p>
<p>实际上消失的是包前缀，它的值等于传递给create-from-project的package属性，如果不传递，则使用原始项目的包前缀。</p>
<p>生成的原型元数据中有如下片段：</p>
<pre class="crayon-plain-tag">&lt;fileSet filtered="true" packaged="true" encoding="UTF-8"&gt;
  &lt;directory&gt;src/main/java&lt;/directory&gt;
  &lt;includes&gt;
    &lt;include&gt;**/*.java&lt;/include&gt;
  &lt;/includes&gt;
&lt;/fileSet&gt;</pre>
<p>其中package=true含义是，从原型生成项目时，archetype-resources/src/main/java中的内容会被包裹在$package指定的目录结构中。</p>
<div class="blog_h3"><span class="graybg">抽取属性</span></div>
<p>在文件中添加一个配置：</p>
<pre class="crayon-plain-tag">application=App</pre>
<p>它的含义是，搜索原始项目的路径、文件中的文本，将App都更换为Application变量。对于本示例项目来说，其效果是：</p>
<ol>
<li>App.java的文件名替换为<pre class="crayon-plain-tag">__application__.java</pre></li>
<li>App.java中的类名被替换为<pre class="crayon-plain-tag">${application} </pre></li>
</ol>
<p>这是一种简单粗暴的查找替换，使用时务必小心。 </p>
<div class="blog_h2"><span class="graybg">测试原型</span></div>
<p>仍然使用上个例子，首先，构建并安装原型：</p>
<pre class="crayon-plain-tag">mvn clean  archetype:create-from-project \
    -Darchetype.properties=archetype.properties -Darchetype.postPhase=install</pre>
<p>本地原型目录会自动更新。</p>
<p>基于该原型创建一个新项目：</p>
<pre class="crayon-plain-tag">mvn archetype:generate -B -DarchetypeGroupId=cc.gmem.study.mvn \
    -DarchetypeArtifactId=archetype-proto-archetype -DarchetypeVersion=1.0-SNAPSHOT \
    -DgroupId=cc.gmem -DartifactId=project -Dversion=1.0-SNAPSHOT \
                              # 传递自定义属性
    -Dpackage=cc.gmem.project -Dapplication=ProjectApp</pre>
<p>检查生成的项目， 可以看到目录结构如下：</p>
<pre class="crayon-plain-tag">.
└── project
    ├── archetype-metadata.yaml
    ├── pom.xml
    └── src
        └── main
            └── java
                └── cc
                    └── gmem
                        └── project
                            ├── ProjectApp.java
                            └── service
                                └── ProjectAppService.java </pre>
<div class="blog_h1"><span class="graybg">maven-archetype-plugin</span></div>
<p>要在Maven中使用原型来生成项目骨架，必须依赖于maven-archetype-plugin。此插件依赖Java 7+版本，主流IDE内置了该插件。</p>
<p>maven-archetype-plugin使用<a href="/velocity-study-note">Velocity</a>作为模板引擎。</p>
<div class="blog_h2"><span class="graybg">maven-archetype</span></div>
<p>这是Maven原型项目的packaging，这种打包方式的生命周期绑定以下目标</p>
<ol>
<li>archetype:jar，绑定到package阶段，生成原型的JAR包</li>
<li>archetype:integration-test，绑定到integration-test阶段</li>
<li>archetype:update-local-catalog，绑定到install阶段，更新本地原型目录</li>
</ol>
<div class="blog_h2"><span class="graybg">generate </span></div>
<p>从原型生成项目骨架：</p>
<ol>
<li>如果从原型创建新的Maven项目，则输出到名为项目artifactId的目录</li>
<li>如果使用一个<span style="background-color: #c0c0c0;">偏原型（partial archetype）</span>更新已有项目，则输出到当前目录</li>
</ol>
<p>用户需要从原型目录中选择一个原型，从远程仓库将原型拉取下来，然后生成项目。调用示例：</p>
<pre class="crayon-plain-tag"># -B表示批处理模式，等价于-DinteractiveMode=false
mvn archetype:generate -B -DarchetypeGroupId=org.apache.maven.archetypes \
    -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.1 \
    -DgroupId=com.company -DartifactId=project -Dversion=1.0-SNAPSHOT \
    -Dpackage=com.company.project</pre>
<p>其中通过-D传递的，是目标的参数。</p>
<div class="blog_h3"><span class="graybg">目标参数</span></div>
<p>可用参数包括：</p>
<table class="full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 30%; text-align: center;">参数</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>interactiveMode</td>
<td>是否以交互的方式生成</td>
</tr>
<tr>
<td>archetypeCatalog</td>
<td>
<p>从哪个原型目录中读取原型：</p>
<ol>
<li>local 本地仓库</li>
<li>remote 远程仓库，Maven中心仓库或者其镜像</li>
<li>internal 内部目录</li>
</ol>
</td>
</tr>
<tr>
<td>archetypeGroupId</td>
<td rowspan="3">从什么原型生成，原型的坐标</td>
</tr>
<tr>
<td>archetypeArtifactId</td>
</tr>
<tr>
<td>archetypeVersion</td>
</tr>
<tr>
<td>filter</td>
<td>为显示的原型列表提供过滤器</td>
</tr>
<tr>
<td>goals</td>
<td>在新生成的项目上执行的目标</td>
</tr>
<tr>
<td>outputDirectory</td>
<td>输出目录</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">create-from-project</span></div>
<p>该目标用于从现有的项目（以下称原始项目）反向生成原型。它会读取项目中的源文件、资源文件，你通过.property指定的原型属性文件，并产生一个原型项目。原始项目中的文本文件会被转换为Velocity模板。</p>
<div class="blog_h3"><span class="graybg">目标参数</span></div>
<table class="full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 30%; text-align: center;">参数/属性</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>
<p>archetypeFilteredExtentions<br />archetype.filteredExtentions</p>
</td>
<td>检查哪些扩展名，以获取项目的文本文件</td>
</tr>
<tr>
<td>
<p>archetypeLanguages<br />archetype.languages</p>
</td>
<td>从什么目录来查项目的源码主包</td>
</tr>
<tr>
<td>
<p>archetypePostPhase<br />archetype.postPhase</p>
</td>
<td>
<p>在生成原型后，针对原型执行什么目标</p>
<p>默认package，可选package, integration-test, install, deploy</p>
</td>
</tr>
<tr>
<td>defaultEncoding<br />archetype.encoding</td>
<td>Velocity模板的编码方式。默认UTF-8</td>
</tr>
<tr>
<td>interactive</td>
<td>是否交互式的生成原型</td>
</tr>
<tr>
<td>keepParent<br />archetype.keepParent</td>
<td>从原型创建新的项目时，其POM中的parent引用和原始项目一致</td>
</tr>
<tr>
<td>outputDirectory</td>
<td>原型项目的输出目录</td>
</tr>
<tr>
<td>packageName</td>
<td>项目包名，原始项目文本文件中出现的packageName会被替换为Velocity变量</td>
</tr>
<tr>
<td>partialArchetype<br />archetype.partialArchetype</td>
<td>是否生成为偏模板</td>
</tr>
<tr>
<td>preserveCData<br />archetype.preserveCData</td>
<td>使用CDATA preservation来创建Velocity模板</td>
</tr>
<tr>
<td>propertyFile<br />archetype.properties</td>
<td>
<p>包含了此插件配置的属性文件，如果提供该参数，则创建会从中读取属性。默认值archetype.properties</p>
<p>属性分为两类：标准属性、定制属性</p>
<p>标准属性包括：</p>
<ol>
<li>package</li>
<li>archetype.languages。默认值java, xml, txt, groovy, cs, mdo, aj, jsp, gsp, vm, html, xhtml, properties, .classpath, .project</li>
<li>groupId  artifactId version 生成的项目的默认GAV</li>
<li>excludePatterns 不包含在生成的原型中的路径列表，逗号分隔</li>
<li>archetype.filteredExtensions 。默认值java, groovy, csharp, aspectj</li>
</ol>
<p>定制属性：你可以指定自己的定制属性，需要了解：</p>
<ol>
<li>定制属性的名称不能包含点号（Velocity限制）</li>
<li>如果设置了定制属性NAME=VALUE，则该插件会搜索项目文本文件中的VALUE，并全部替换为Velicoty变量NAME</li>
</ol>
</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">crawl</span></div>
<p>爬取文件系统中的Maven仓库，产生一个Maven原型目录文件。</p>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/maven-archetypes">Maven原型系统</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/maven-archetypes/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Maven依赖速查表</title>
		<link>https://blog.gmem.cc/maven-dependency-table</link>
		<comments>https://blog.gmem.cc/maven-dependency-table#comments</comments>
		<pubDate>Mon, 26 Mar 2012 09:47:52 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Maven]]></category>

		<guid isPermaLink="false">http://blog.gmem.cc/?p=1135</guid>
		<description><![CDATA[<p>Log4j2 + Slf4j [crayon-69e8cfbe375b5848668308/] Axis1.x客户端 [crayon-69e8cfbe375ba117978581/] Velocity [crayon-69e8cfbe375bc593302474/] JSR250以及JSR330 [crayon-69e8cfbe375be062482364/] Jackson JSON 2.x [crayon-69e8cfbe375c0828603803/] CXF依赖（包含jettey传输） [crayon-69e8cfbe375c3326113533/] Axis2动态客户端 [crayon-69e8cfbe375c5847767940/] 支持XA的事务管理器atomikos [crayon-69e8cfbe375c7657269835/] Quartz任务调度组件 [crayon-69e8cfbe375ca156485128/]</p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/maven-dependency-table">Maven依赖速查表</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h3"><span class="graybg">Log4j2 + Slf4j</span></div>
<pre class="crayon-plain-tag">&lt;!-- 使用Log4J2--&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.apache.logging.log4j&lt;/groupId&gt;
    &lt;artifactId&gt;log4j-api&lt;/artifactId&gt;
    &lt;version&gt;2.8.2&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.apache.logging.log4j&lt;/groupId&gt;
    &lt;artifactId&gt;log4j-core&lt;/artifactId&gt;
    &lt;version&gt;2.8.2&lt;/version&gt;
&lt;/dependency&gt;
&lt;!-- 让commons logging使用Log4j2 --&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.apache.logging.log4j&lt;/groupId&gt;
    &lt;artifactId&gt;log4j-jcl&lt;/artifactId&gt;
    &lt;version&gt;2.8.2&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.slf4j&lt;/groupId&gt;
    &lt;artifactId&gt;slf4j-api&lt;/artifactId&gt;
    &lt;version&gt;1.7.21&lt;/version&gt;
&lt;/dependency&gt;
&lt;!-- 让Slf4j使用Log4j2 --&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.apache.logging.log4j&lt;/groupId&gt;
    &lt;artifactId&gt;log4j-slf4j-impl&lt;/artifactId&gt;
    &lt;version&gt;2.8.2&lt;/version&gt;
&lt;/dependency&gt; </pre>
<div class="blog_h3"><span class="graybg">Axis1.x客户端</span></div>
<pre class="crayon-plain-tag">&lt;dependency&gt;
    &lt;groupId&gt;axis&lt;/groupId&gt;
    &lt;artifactId&gt;axis&lt;/artifactId&gt;
    &lt;version&gt;1.4&lt;/version&gt;
&lt;/dependency&gt;
    &lt;dependency&gt;
    &lt;groupId&gt;axis&lt;/groupId&gt;
    &lt;artifactId&gt;axis-jaxrpc&lt;/artifactId&gt;
    &lt;version&gt;1.4&lt;/version&gt;
&lt;/dependency&gt;</pre>
<div class="blog_h3"><span class="graybg">Velocity</span></div>
<pre class="crayon-plain-tag">&lt;dependency&gt;
  &lt;groupId&gt;org.apache.velocity&lt;/groupId&gt;
  &lt;artifactId&gt;velocity&lt;/artifactId&gt;
  &lt;version&gt;1.7&lt;/version&gt;
&lt;/dependency&gt;</pre>
<div class="blog_h3"><span class="graybg">JSR250以及JSR330</span></div>
<pre class="crayon-plain-tag">&lt;dependency&gt;
    &lt;groupId&gt;javax.annotation&lt;/groupId&gt;
    &lt;artifactId&gt;jsr250-api&lt;/artifactId&gt;
    &lt;version&gt;1.0&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
    &lt;groupId&gt;javax.inject&lt;/groupId&gt;
    &lt;artifactId&gt;javax.inject&lt;/artifactId&gt;
    &lt;version&gt;1&lt;/version&gt;
&lt;/dependency&gt;</pre>
<div class="blog_h3"><span class="graybg">Jackson JSON 2.x</span></div>
<pre class="crayon-plain-tag">&lt;dependency&gt;
    &lt;groupId&gt;com.fasterxml.jackson.core&lt;/groupId&gt;
    &lt;artifactId&gt;jackson-core&lt;/artifactId&gt;
    &lt;version&gt;2.0.4&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
    &lt;groupId&gt;com.fasterxml.jackson.core&lt;/groupId&gt;
    &lt;artifactId&gt;jackson-databind&lt;/artifactId&gt;
    &lt;version&gt;2.0.4&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
    &lt;groupId&gt;com.fasterxml.jackson.core&lt;/groupId&gt;
    &lt;artifactId&gt;jackson-annotations&lt;/artifactId&gt;
    &lt;version&gt;2.0.4&lt;/version&gt;
&lt;/dependency&gt;</pre>
<div class="blog_h3"><span class="graybg">CXF依赖（包含jettey传输）</span></div>
<pre class="crayon-plain-tag">&lt;dependency&gt;
    &lt;groupId&gt;org.apache.cxf&lt;/groupId&gt;
    &lt;artifactId&gt;cxf-rt-frontend-jaxws&lt;/artifactId&gt;
    &lt;version&gt;2.5.0&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.apache.cxf&lt;/groupId&gt;
    &lt;artifactId&gt;cxf-rt-transports-http&lt;/artifactId&gt;
    &lt;version&gt;2.5.0&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.apache.cxf&lt;/groupId&gt;
    &lt;artifactId&gt;cxf-rt-transports-http-jetty&lt;/artifactId&gt;
    &lt;version&gt;2.5.0&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
    &lt;groupId&gt;javax.xml.ws&lt;/groupId&gt;
    &lt;artifactId&gt;jaxws-api&lt;/artifactId&gt;
    &lt;version&gt;2.2.6&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
    &lt;groupId&gt;javax.xml&lt;/groupId&gt;
    &lt;artifactId&gt;jaxb-api&lt;/artifactId&gt;
    &lt;version&gt;2.1&lt;/version&gt;
&lt;/dependency&gt;</pre>
<div class="blog_h3"><span class="graybg">Axis2动态客户端</span></div>
<pre class="crayon-plain-tag">&lt;dependency&gt;
    &lt;groupId&gt;org.apache.axis2&lt;/groupId&gt;
    &lt;artifactId&gt;axis2-adb&lt;/artifactId&gt;
    &lt;version&gt;1.6.2&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.apache.axis2&lt;/groupId&gt;
    &lt;artifactId&gt;axis2-transport-local&lt;/artifactId&gt;
    &lt;version&gt;1.6.2&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.apache.axis2&lt;/groupId&gt;
    &lt;artifactId&gt;axis2-transport-http&lt;/artifactId&gt;
    &lt;version&gt;1.6.2&lt;/version&gt;
&lt;/dependency&gt;</pre>
<div class="blog_h3"><span class="graybg">支持XA的事务管理器atomikos</span></div>
<pre class="crayon-plain-tag">&lt;dependency&gt;
    &lt;groupId&gt;com.atomikos&lt;/groupId&gt;
    &lt;artifactId&gt;transactions&lt;/artifactId&gt;
    &lt;version&gt;3.8.0&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
    &lt;groupId&gt;com.atomikos&lt;/groupId&gt;
    &lt;artifactId&gt;transactions-api&lt;/artifactId&gt;
    &lt;version&gt;3.8.0&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
    &lt;groupId&gt;com.atomikos&lt;/groupId&gt;
    &lt;artifactId&gt;transactions-hibernate3&lt;/artifactId&gt;
    &lt;version&gt;3.8.0&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
    &lt;groupId&gt;com.atomikos&lt;/groupId&gt;
    &lt;artifactId&gt;transactions-jdbc&lt;/artifactId&gt;
    &lt;version&gt;3.8.0&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
    &lt;groupId&gt;com.atomikos&lt;/groupId&gt;
    &lt;artifactId&gt;transactions-jms&lt;/artifactId&gt;
    &lt;version&gt;3.8.0&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
    &lt;groupId&gt;com.atomikos&lt;/groupId&gt;
    &lt;artifactId&gt;transactions-jta&lt;/artifactId&gt;
    &lt;version&gt;3.8.0&lt;/version&gt;
&lt;/dependency&gt;</pre>
<div class="blog_h3"><span class="graybg">Quartz任务调度组件</span></div>
<pre class="crayon-plain-tag">&lt;dependency&gt;
    &lt;groupId&gt;org.quartz-scheduler&lt;/groupId&gt;
    &lt;artifactId&gt;quartz&lt;/artifactId&gt;
    &lt;version&gt;2.1.6&lt;/version&gt;
&lt;/dependency&gt;</pre>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/maven-dependency-table">Maven依赖速查表</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/maven-dependency-table/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Maven POM文件配置示例</title>
		<link>https://blog.gmem.cc/maven-pom-demo</link>
		<comments>https://blog.gmem.cc/maven-pom-demo#comments</comments>
		<pubDate>Wed, 22 Jul 2009 05:19:40 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[POM]]></category>

		<guid isPermaLink="false">http://blog.gmem.cc/?p=1054</guid>
		<description><![CDATA[<p>排除传递性依赖 [crayon-69e8cfbe37b4e572468169/] 指定资源文件目录并过滤 [crayon-69e8cfbe37b52898171381/] 指定额外的源代码目录 [crayon-69e8cfbe37b54094084318/] 过滤资源文件 [crayon-69e8cfbe37b57614956060/] 配置目录链接（Linked Folder） [crayon-69e8cfbe37b59221439779/] 打包时生成*–sources.jar [crayon-69e8cfbe37b5b840064313/] 打包时生成*–javadoc.jar [crayon-69e8cfbe37b5d321222361/] 指定编译级别 [crayon-69e8cfbe37b5f815336422/] 启用对AspectJ的支持 [crayon-69e8cfbe37b62440601892/] 指定源代码、资源文件的编码方式 [crayon-69e8cfbe37b64923891252/] 打包时拷贝所有依赖包 <a class="read-more" href="https://blog.gmem.cc/maven-pom-demo">[...]</a></p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/maven-pom-demo">Maven POM文件配置示例</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h3"><span class="graybg">排除传递性依赖</span></div>
<pre class="crayon-plain-tag">&lt;dependency&gt;
    &lt;groupId&gt;org.apache.cxf&lt;/groupId&gt;
    &lt;artifactId&gt;cxf-rt-transports-http&lt;/artifactId&gt;
    &lt;version&gt;2.5.0&lt;/version&gt;
    &lt;exclusions&gt;
        &lt;exclusion&gt;
            &lt;!-- CXF对Spring-web的依赖被排除 --&gt;
            &lt;groupId&gt;org.springframework&lt;/groupId&gt;
            &lt;artifactId&gt;spring-web&lt;/artifactId&gt;
        &lt;/exclusion&gt;
    &lt;/exclusions&gt;
&lt;/dependency&gt;</pre>
<div class="blog_h3"><span class="graybg">指定资源文件目录并过滤</span></div>
<pre class="crayon-plain-tag">&lt;build&gt;
    &lt;directory&gt;target&lt;/directory&gt;
    &lt;outputDirectory&gt;target/classes&lt;/outputDirectory&gt;
    &lt;testOutputDirectory&gt;target/test-classes&lt;/testOutputDirectory&gt;
    &lt;sourceDirectory&gt;src/main/java&lt;/sourceDirectory&gt;
    &lt;testSourceDirectory&gt;src/test/java&lt;/testSourceDirectory&gt;
    &lt;resources&gt;
        &lt;resource&gt;
            &lt;!-- 在这里可以指定多个资源文件目录 --&gt;
            &lt;directory&gt;src/main/java&lt;/directory&gt;
            &lt;excludes&gt;
                &lt;!--注意该配置从本应当是源代码的目录中过滤掉Java文件，其他文件作为资源文件 --&gt;
                &lt;exclude&gt;**/*.java&lt;/exclude&gt;
            &lt;/excludes&gt;
        &lt;/resource&gt;
        &lt;resource&gt;
            &lt;directory&gt;src/main/resources&lt;/directory&gt;
        &lt;/resource&gt;
    &lt;/resources&gt;
    &lt;testResources&gt;
        &lt;testResource&gt;
            &lt;directory&gt;src/test/resources&lt;/directory&gt;
        &lt;/testResource&gt;
    &lt;/testResources&gt;
&lt;/build&gt;</pre>
<div class="blog_h3"><span class="graybg">指定额外的源代码目录</span></div>
<pre class="crayon-plain-tag">&lt;plugin&gt;
  &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
  &lt;artifactId&gt;build-helper-maven-plugin&lt;/artifactId&gt;
  &lt;version&gt;1.7&lt;/version&gt;
  &lt;executions&gt;
    &lt;execution&gt;
      &lt;phase&gt;generate-sources&lt;/phase&gt;
      &lt;goals&gt;
        &lt;goal&gt;add-source&lt;/goal&gt;
      &lt;/goals&gt;
      &lt;configuration&gt;
        &lt;sources&gt;
          &lt;source&gt;src/birt/java&lt;/source&gt;
          &lt;source&gt;src/cms/java&lt;/source&gt;
        &lt;/sources&gt;
      &lt;/configuration&gt;
    &lt;/execution&gt;
  &lt;/executions&gt;
&lt;/plugin&gt;</pre>
<div class="blog_h3"><span class="graybg">过滤资源文件</span></div>
<pre class="crayon-plain-tag">&lt;build&gt;
    &lt;resources&gt;
        &lt;resource&gt;
            &lt;!-- 启用src/main/resources的资源过滤 --&gt;
            &lt;filtering&gt;true&lt;/filtering&gt;
            &lt;directory&gt;src/main/resources&lt;/directory&gt;
            &lt;excludes&gt;
                &lt;!-- 排除资源文件 --&gt;
                &lt;exclude&gt;application-${environment}.properties&lt;/exclude&gt;
            &lt;/excludes&gt;
        &lt;/resource&gt;
    &lt;/resources&gt;
&lt;/build&gt;</pre>
<div class="blog_h3"><span class="graybg">配置目录链接（Linked Folder）</span></div>
<pre class="crayon-plain-tag">&lt;plugin&gt;
    &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
    &lt;artifactId&gt;maven-eclipse-plugin&lt;/artifactId&gt;
    &lt;version&gt;2.10&lt;/version&gt;
    &lt;configuration&gt;
        &lt;linkedResources&gt;
            &lt;linkedResource&gt;
                &lt;name&gt;src/main/webapp&lt;/name&gt;
                &lt;type&gt;2&lt;/type&gt;
                &lt;location&gt;D:/www&lt;/location&gt;
            &lt;/linkedResource&gt;
        &lt;/linkedResources&gt;
    &lt;/configuration&gt;
&lt;/plugin&gt;</pre>
<div class="blog_h3"><span class="graybg">打包时生成*–sources.jar</span></div>
<pre class="crayon-plain-tag">&lt;plugin&gt;
    &lt;artifactId&gt;maven-source-plugin&lt;/artifactId&gt;
    &lt;version&gt;2.2.1&lt;/version&gt;
    &lt;configuration&gt;
        &lt;attach&gt;true&lt;/attach&gt;
    &lt;/configuration&gt;
    &lt;executions&gt;
        &lt;execution&gt;
            &lt;phase&gt;compile&lt;/phase&gt;
            &lt;goals&gt;
                &lt;goal&gt;jar&lt;/goal&gt;
            &lt;/goals&gt;
        &lt;/execution&gt;
    &lt;/executions&gt;
&lt;/plugin&gt;</pre>
<div class="blog_h3"><span class="graybg">打包时生成*–javadoc.jar</span></div>
<pre class="crayon-plain-tag">&lt;plugin&gt;
     &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
     &lt;artifactId&gt;maven-javadoc-plugin&lt;/artifactId&gt;
     &lt;executions&gt;
         &lt;execution&gt;
              &lt;id&gt;attach-javadocs&lt;/id&gt;
               &lt;goals&gt;
                   &lt;goal&gt;jar&lt;/goal&gt;
                &lt;/goals&gt;
          &lt;/execution&gt;
       &lt;/executions&gt;
 &lt;/plugin&gt;</pre>
<div class="blog_h3"><span class="graybg">指定编译级别</span></div>
<pre class="crayon-plain-tag">&lt;plugin&gt;
    &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;
    &lt;version&gt;2.4&lt;/version&gt;
    &lt;configuration&gt;
        &lt;encoding&gt;${project.build.sourceEncoding}&lt;/encoding&gt;
        &lt;source&gt;1.5&lt;/source&gt;
        &lt;target&gt;1.5&lt;/target&gt;
        &lt;debug&gt;true&lt;/debug&gt;
    &lt;/configuration&gt;
&lt;/plugin&gt;</pre>
<div class="blog_h3"><span class="graybg">启用对AspectJ的支持</span></div>
<pre class="crayon-plain-tag">&lt;plugin&gt;
    &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
    &lt;artifactId&gt;aspectj-maven-plugin&lt;/artifactId&gt;
    &lt;version&gt;1.4&lt;/version&gt;
    &lt;executions&gt;
        &lt;execution&gt;
            &lt;id&gt;compile&lt;/id&gt;
            &lt;configuration&gt;
                &lt;XnoInline&gt;true&lt;/XnoInline&gt;
                &lt;forceAjcCompile&gt;true&lt;/forceAjcCompile&gt;
                &lt;showWeaveInfo&gt;true&lt;/showWeaveInfo&gt;
                &lt;source&gt;1.5&lt;/source&gt;
                &lt;target&gt;1.5&lt;/target&gt;
                &lt;encoding&gt;UTF-8&lt;/encoding&gt;
                &lt;verbose&gt;true&lt;/verbose&gt;
                &lt;outxml&gt;true&lt;/outxml&gt;
                &lt;aspectLibraries&gt;
                    &lt;aspectLibrary&gt;
                        &lt;!--下面的构件同时需要在dependency里面配置--&gt;
                        &lt;groupId&gt;org.springframework&lt;/groupId&gt;
                        &lt;artifactId&gt;spring-aspects&lt;/artifactId&gt;
                    &lt;/aspectLibrary&gt;
                &lt;/aspectLibraries&gt;
            &lt;/configuration&gt;
            &lt;goals&gt;
                &lt;goal&gt;compile&lt;/goal&gt;
                &lt;goal&gt;test-compile&lt;/goal&gt;
            &lt;/goals&gt;
        &lt;/execution&gt;
    &lt;/executions&gt;
&lt;/plugin&gt;</pre>
<div class="blog_h3"><span class="graybg">指定源代码、资源文件的编码方式</span></div>
<pre class="crayon-plain-tag">&lt;plugin&gt;
    &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;
    &lt;version&gt;2.4&lt;/version&gt;
    &lt;configuration&gt;
        &lt;encoding&gt;${project.build.sourceEncoding}&lt;/encoding&gt;
    &lt;/configuration&gt;
&lt;/plugin&gt;
&lt;plugin&gt;
    &lt;artifactId&gt;maven-resources-plugin&lt;/artifactId&gt;
    &lt;version&gt;2.6&lt;/version&gt;
    &lt;configuration&gt;
        &lt;encoding&gt;${project.build.sourceEncoding}&lt;/encoding&gt;
    &lt;/configuration&gt;
&lt;/plugin&gt;</pre>
<div class="blog_h3"><span class="graybg">打包时拷贝所有依赖包</span></div>
<pre class="crayon-plain-tag">&lt;plugin&gt;
    &lt;artifactId&gt;maven-dependency-plugin&lt;/artifactId&gt;
    &lt;version&gt;2.8&lt;/version&gt;
    &lt;executions&gt;
        &lt;execution&gt;
            &lt;phase&gt;package&lt;/phase&gt;
            &lt;goals&gt;
                &lt;goal&gt;copy-dependencies&lt;/goal&gt;
            &lt;/goals&gt;
            &lt;configuration&gt;
                &lt;outputDirectory&gt;${project.build.directory}/lib&lt;/outputDirectory&gt;
            &lt;/configuration&gt;
        &lt;/execution&gt;
    &lt;/executions&gt;
&lt;/plugin&gt; </pre>
<div class="blog_h3"><span class="graybg">打包生成可执行的jar文件</span></div>
<pre class="crayon-plain-tag">&lt;plugin&gt;
    &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
    &lt;artifactId&gt;maven-assembly-plugin&lt;/artifactId&gt;
    &lt;version&gt;2.6&lt;/version&gt;
    &lt;executions&gt;
        &lt;execution&gt;
            &lt;phase&gt;package&lt;/phase&gt;
            &lt;goals&gt;
                &lt;goal&gt;single&lt;/goal&gt;
            &lt;/goals&gt;
            &lt;configuration&gt;
                &lt;archive&gt;
                    &lt;manifest&gt;
                        &lt;mainClass&gt;cc.gmem.common.Application&lt;/mainClass&gt;
                    &lt;/manifest&gt;
                &lt;/archive&gt;
                &lt;appendAssemblyId&gt;true&lt;/appendAssemblyId&gt;
                &lt;descriptorRefs&gt;
                    &lt;descriptorRef&gt;jar-with-dependencies&lt;/descriptorRef&gt;
                &lt;/descriptorRefs&gt;
            &lt;/configuration&gt;
        &lt;/execution&gt;
    &lt;/executions&gt;
&lt;/plugin&gt;</pre>
<div class="blog_h3"><span class="graybg">打uber-jar另一种方法</span></div>
<p>maven-shade-plugin也支持将依赖打包进JAR，这类似于maven-assembly-plugin。但是后者存在BUG，会导致Unable to locate Spring NamespaceHandler for XML schema namespace这样的错误。</p>
<p>除了打包指外，maven-shade-plugin还具有重命名（Shade）功能 —— 修改某些包名。</p>
<pre class="crayon-plain-tag">&lt;plugin&gt;
    &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
    &lt;artifactId&gt;maven-shade-plugin&lt;/artifactId&gt;
    &lt;version&gt;3.1.1&lt;/version&gt;
    &lt;executions&gt;
        &lt;execution&gt;
            &lt;phase&gt;package&lt;/phase&gt;
            &lt;goals&gt;
                &lt;goal&gt;shade&lt;/goal&gt;
            &lt;/goals&gt;
            &lt;configuration&gt;
                &lt;!-- 禁止生成dependency-reduced-pom.xml --&gt;
                &lt;createDependencyReducedPom&gt;false&lt;/createDependencyReducedPom&gt;
                &lt;transformers&gt;
                    &lt;transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"&gt;
                        &lt;resource&gt;META-INF/spring.handlers&lt;/resource&gt;
                    &lt;/transformer&gt;
                    &lt;transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"&gt;
                        &lt;resource&gt;META-INF/spring.schemas&lt;/resource&gt;
                    &lt;/transformer&gt;
                &lt;/transformers&gt;
                &lt;filters&gt;
                    &lt;!-- 解决报错：Invalid signature file digest for Manifest main attributes --&gt;
                    &lt;filter&gt;
                        &lt;artifact&gt;*:*&lt;/artifact&gt;
                        &lt;excludes&gt;
                            &lt;exclude&gt;META-INF/*.SF&lt;/exclude&gt;
                            &lt;exclude&gt;META-INF/*.DSA&lt;/exclude&gt;
                            &lt;exclude&gt;META-INF/*.RSA&lt;/exclude&gt;
                        &lt;/excludes&gt;
                    &lt;/filter&gt;
                &lt;/filters&gt;
            &lt;/configuration&gt;
        &lt;/execution&gt;
    &lt;/executions&gt;
&lt;/plugin&gt;</pre>
<div class="blog_h3"><span class="graybg">使用profile打带分类器（classifer）的jar包</span></div>
<pre class="crayon-plain-tag">#分类器打包命令示例
mvn clean jar -P jdk15</pre><br />
<pre class="crayon-plain-tag">&lt;!-- 引用带分类器的构件 --&gt;
&lt;dependency&gt;
  &lt;groupId&gt;cc.gmem.tools&lt;/groupId&gt;
  &lt;artifactId&gt;cmd-tools&lt;/artifactId&gt;
  &lt;version&gt;1.0&lt;/version&gt;
  &lt;classifier&gt;jdk15&lt;/classifier&gt;
&lt;/dependency&gt;</pre><br />
<pre class="crayon-plain-tag">&lt;project&gt;
    &lt;build&gt;
        &lt;plugins&gt;
            &lt;plugin&gt;
                &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
                &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;
                &lt;version&gt;2.3.2&lt;/version&gt;
                &lt;configuration&gt;
                    &lt;encoding&gt;UTF-8&lt;/encoding&gt;
                    &lt;source&gt;${jar.source}&lt;/source&gt;
                    &lt;target&gt;${jar.target}&lt;/target&gt;
                &lt;/configuration&gt;
            &lt;/plugin&gt;
        &lt;/plugins&gt;
    &lt;/build&gt;
    &lt;!-- 执行mvn命令时，使用-P参数激活某个profile --&gt;
    &lt;profiles&gt;
        &lt;profile&gt;
            &lt;id&gt;default&lt;/id&gt;
            &lt;activation&gt;
                &lt;activeByDefault&gt;true&lt;/activeByDefault&gt;
            &lt;/activation&gt;
            &lt;properties&gt;
                &lt;jar.source&gt;1.6&lt;/jar.source&gt;
                &lt;jar.target&gt;1.6&lt;/jar.target&gt;
            &lt;/properties&gt;
        &lt;/profile&gt;
        &lt;profile&gt;
            &lt;id&gt;jdk15&lt;/id&gt;
            &lt;build&gt;
                &lt;plugins&gt;
                    &lt;plugin&gt;
                        &lt;artifactId&gt;maven-jar-plugin&lt;/artifactId&gt;
                        &lt;executions&gt;
                            &lt;execution&gt;
                                &lt;phase&gt;package&lt;/phase&gt;
                                &lt;goals&gt;
                                    &lt;goal&gt;jar&lt;/goal&gt;
                                &lt;/goals&gt;
                                &lt;configuration&gt;
                                    &lt;classifier&gt;jdk15&lt;/classifier&gt;
                                &lt;/configuration&gt;
                            &lt;/execution&gt;
                        &lt;/executions&gt;
                    &lt;/plugin&gt;
                &lt;/plugins&gt;
            &lt;/build&gt;
            &lt;properties&gt;
                &lt;jar.source&gt;1.5&lt;/jar.source&gt;
                &lt;jar.target&gt;1.5&lt;/jar.target&gt;
            &lt;/properties&gt;
        &lt;/profile&gt;
        &lt;profile&gt;
            &lt;id&gt;jdk14&lt;/id&gt;
            &lt;build&gt;
                &lt;plugins&gt;
                    &lt;plugin&gt;
                        &lt;artifactId&gt;maven-jar-plugin&lt;/artifactId&gt;
                        &lt;executions&gt;
                            &lt;execution&gt;
                                &lt;phase&gt;package&lt;/phase&gt;
                                &lt;goals&gt;
                                    &lt;goal&gt;jar&lt;/goal&gt;
                                &lt;/goals&gt;
                                &lt;configuration&gt;
                                    &lt;classifier&gt;jdk14&lt;/classifier&gt;
                                &lt;/configuration&gt;
                            &lt;/execution&gt;
                        &lt;/executions&gt;
                    &lt;/plugin&gt;
                &lt;/plugins&gt;
            &lt;/build&gt;
            &lt;properties&gt;
                &lt;jar.source&gt;1.4&lt;/jar.source&gt;
                &lt;jar.target&gt;1.4&lt;/jar.target&gt;
            &lt;/properties&gt;
        &lt;/profile&gt;
    &lt;/profiles&gt;
&lt;/project&gt;</pre>
<div class="blog_h3"><span class="graybg">执行Junit测试控制台输出乱码问题</span></div>
<pre class="crayon-plain-tag">&lt;plugin&gt;
    &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
    &lt;artifactId&gt;maven-surefire-plugin&lt;/artifactId&gt;
    &lt;version&gt;2.15&lt;/version&gt;
    &lt;dependencies&gt;
        &lt;dependency&gt;
            &lt;groupId&gt; org.apache.maven.surefire&lt;/groupId&gt;
            &lt;artifactId&gt; surefire-junit47&lt;/artifactId&gt;
            &lt;version&gt; 2.15&lt;/ version&gt;
        &lt;/dependency&gt;
    &lt;/dependencies&gt;
    &lt;configuration&gt;
        &lt;argLine&gt; -Dfile.encoding=UTF-8&lt;/argLine&gt;
    &lt;/configuration&gt;
&lt;/plugin&gt;</pre>
<div class="blog_h3"><span class="graybg">将war构件中的Java类独立打包</span></div>
<pre class="crayon-plain-tag">&lt;plugin&gt;
    &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
    &lt;artifactId&gt;maven-war-plugin&lt;/artifactId&gt;
    &lt;version&gt;2.4&lt;/version&gt;
    &lt;configuration&gt;
        &lt;!-- 下面的配置参数导致所有Java类被打包到一个JAR文件，并嵌入在WEB-INF/LIB下 --&gt;
        &lt;archiveClasses&gt;true&lt;/archiveClasses&gt;
        &lt;!-- 
        下面的配置参数导致所有Java类被导报到一个JAR文件，并作为额外的构件看待
        该构件的名称为[groupId].[artifactId].[version]-classes.jar
        其它项目可以通过分类器classes来引用此JAR:
             &lt;groupId&gt;myGroup&lt;/groupId&gt;
             &lt;artifactId&gt;myArtifact&lt;/artifactId&gt;
             &lt;version&gt;myVersion&lt;/myVersion&gt;
             &lt;classifier&gt;classes&lt;/classifier&gt;
        --&gt;
        &lt;attachClasses&gt;true&lt;/attachClasses&gt;
        &lt;!-- 上述额外构件的分类器字段的名称，默认classes --&gt;
        &lt;classesClassifier&gt;classes&lt;/classesClassifier&gt;
    &lt;/configuration&gt;
&lt;/plugin&gt;</pre>
<div class="blog_h3"><span class="graybg">将多个war包构件的内容合并到一个中</span></div>
<pre class="crayon-plain-tag">&lt;dependencies&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;cc.gmem.secmon&lt;/groupId&gt;
        &lt;artifactId&gt;map&lt;/artifactId&gt;
        &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;
        &lt;type&gt;war&lt;/type&gt;
        &lt;scope&gt;runtime&lt;/scope&gt;
        &lt;!-- 以这种方式声明war依赖后，当前项目打包后，该war包的全部内容都会叠加进去--&gt;
    &lt;/dependency&gt;
&lt;/dependencies&gt;
&lt;plugin&gt;
    &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
    &lt;artifactId&gt;maven-war-plugin&lt;/artifactId&gt;
    &lt;version&gt;2.4&lt;/version&gt;
    &lt;configuration&gt;
        &lt;overlays&gt;
            &lt;!-- 使用下面的配置，可以指定war运行时依赖中，哪些内容需要被排除出去 --&gt;
            &lt;!--下面的构件同时需要在dependency里面配置--&gt;
            &lt;overlay&gt;
                &lt;groupId&gt;cc.gmem.secmon&lt;/groupId&gt;
                &lt;artifactId&gt;map&lt;/artifactId&gt;
                &lt;excludes&gt;
                    &lt;exclude&gt;WEB-INF/lib/sshe-*.jar&lt;/exclude&gt;&lt;!-- 通配单个目录或者文件的一部分 --&gt;
                    &lt;exclude&gt;WEB-INF/classes/**/*.class&lt;/exclude&gt; &lt;!-- 双星号通配任意层目录 --&gt;
                &lt;/excludes&gt;
            &lt;/overlay&gt;
            &lt;overlay&gt;
                &lt;groupId&gt;cc.gmem.secmon&lt;/groupId&gt;
                &lt;artifactId&gt;intelli&lt;/artifactId&gt;
                &lt;excludes&gt;
                    &lt;exclude&gt;WEB-INF/lib/comm-tools-*.jar&lt;/exclude&gt;
                &lt;/excludes&gt;
            &lt;/overlay&gt;
        &lt;/overlays&gt;
    &lt;/configuration&gt;
&lt;/plugin&gt;</pre>
<div class="blog_h3"><span class="graybg">指定Maven仓库的位置，在mvn deploy时用到</span></div>
<pre class="crayon-plain-tag">&lt;distributionManagement&gt;
    &lt;repository&gt;
        &lt;id&gt;nexus&lt;/id&gt;
        &lt;url&gt;http://192.168.0.200:8801/nexus/content/repositories/releases&lt;/url&gt;
    &lt;/repository&gt;
    &lt;snapshotRepository&gt;
        &lt;id&gt;nexus&lt;/id&gt;
        &lt;url&gt;http://192.168.0.200:8801/nexus/content/repositories/snapshots&lt;/url&gt;
    &lt;/snapshotRepository&gt;
&lt;/distributionManagement&gt;</pre>
<p>注：在org.apache.maven.plugins:maven-deploy-plugin:2.8.2版本之后，不配置distributionManagement也可以mvn deploy，可以通过命令行指定远程仓库的信息。使用如下系统属性即可：</p>
<pre class="crayon-plain-tag">#            id::layout::url
-DaltReleaseDeploymentRepository=pa-releases::default::https://nexus.pacloud.io/repository/maven-releases/ 
-DaltSnapshotDeploymentRepository=pa-snapshots::default::https://nexus.pacloud.io/repository/maven-snapshots/</pre>
<div class="blog_h3"><span class="graybg">压缩和混淆JavaScript代码</span></div>
<pre class="crayon-plain-tag">&lt;plugin&gt;
    &lt;groupId&gt;net.alchim31.maven&lt;/groupId&gt;
    &lt;artifactId&gt;yuicompressor-maven-plugin&lt;/artifactId&gt;
    &lt;version&gt;1.5.1&lt;/version&gt;
    &lt;executions&gt;
        &lt;execution&gt;
            &lt;phase&gt;process-resources&lt;/phase&gt;&lt;!-- 注意，该阶段在Emvn package -Pproclipse中会自动运行，一旦你保存源码，就会执行压缩 --&gt;
            &lt;goals&gt;
                &lt;goal&gt;compress&lt;/goal&gt;
            &lt;/goals&gt;
        &lt;/execution&gt;
    &lt;/executions&gt;
    &lt;configuration&gt;
        &lt;nosuffix&gt;true&lt;/nosuffix&gt; &lt;!-- 输出js是否不带-min.js后缀 --&gt;
        &lt;!-- 压缩文件存放目录 --&gt;
        &lt;webappDirectory&gt;${project.build.directory}/compressed&lt;/webappDirectory&gt;
        &lt;jswarn&gt;false&lt;/jswarn&gt; &lt;!-- 是否显示警告信息 --&gt;
        &lt;nocompress&gt;false&lt;/nocompress&gt;&lt;!-- 是否压缩 --&gt;
        &lt;nomunge&gt;false&lt;/nomunge&gt;&lt;!-- 是否进行代码混淆 --&gt;
    &lt;/configuration&gt;
&lt;/plugin&gt;
&lt;plugin&gt;
    &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
    &lt;artifactId&gt;maven-war-plugin&lt;/artifactId&gt;
    &lt;version&gt;2.4&lt;/version&gt;
    &lt;configuration&gt;
        &lt;webResources&gt;
            &lt;resource&gt;
                &lt;!-- 这里必须引用压缩文件存放目录 --&gt;
                &lt;directory&gt;${project.build.directory}/compressed&lt;/directory&gt;
            &lt;/resource&gt;
        &lt;/webResources&gt;
    &lt;/configuration&gt;
&lt;/plugin&gt;</pre>
<p>上面的配置，在Eclipse中会导致每次保存JavaScript文件都执行压缩，这会影响性能，因此可以使用Maven的Profile机制，仅在打包时启用压缩，下面是一个例子：</p>
<pre class="crayon-plain-tag">&lt;build&gt;
    &lt;plugins&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
            &lt;artifactId&gt;maven-war-plugin&lt;/artifactId&gt;
            &lt;version&gt;2.4&lt;/version&gt;
            &lt;configuration&gt;
                &lt;overlays&gt;
                    &lt;overlay&gt;
                        &lt;groupId&gt;cc.gmem.study&lt;/groupId&gt;
                        &lt;artifactId&gt;obfuscate-module&lt;/artifactId&gt;
                        &lt;excludes&gt;
                            &lt;exclude&gt;WEB-INF/classes/**/*.class&lt;/exclude&gt;
                        &lt;/excludes&gt;
                    &lt;/overlay&gt;
                &lt;/overlays&gt;
            &lt;/configuration&gt;
        &lt;/plugin&gt;
    &lt;/plugins&gt;
&lt;/build&gt;
&lt;profiles&gt;
    &lt;profile&gt;
        &lt;id&gt;production&lt;/id&gt;
        &lt;properties&gt;
            &lt;yui.compressed.dir&gt;${project.build.directory}/compressed&lt;/yui.compressed.dir&gt;
        &lt;/properties&gt;
        &lt;build&gt;
            &lt;plugins&gt;
                &lt;plugin&gt;
                    &lt;groupId&gt;net.alchim31.maven&lt;/groupId&gt;
                    &lt;artifactId&gt;yuicompressor-maven-plugin&lt;/artifactId&gt;
                    &lt;version&gt;1.5.1&lt;/version&gt;
                    &lt;executions&gt;
                        &lt;execution&gt;
                            &lt;phase&gt;process-resources&lt;/phase&gt;
                            &lt;goals&gt;
                                &lt;goal&gt;compress&lt;/goal&gt;
                            &lt;/goals&gt;
                        &lt;/execution&gt;
                    &lt;/executions&gt;
                    &lt;configuration&gt;
                        &lt;nosuffix&gt;true&lt;/nosuffix&gt; &lt;!-- 输出js是否不带-min.js后缀 --&gt;
                        &lt;!-- 压缩文件存放目录 --&gt;
                        &lt;webappDirectory&gt;${yui.compressed.dir}&lt;/webappDirectory&gt;
                        &lt;jswarn&gt;false&lt;/jswarn&gt; &lt;!-- 是否显示警告信息 --&gt;
                        &lt;nocompress&gt;false&lt;/nocompress&gt;&lt;!-- 是否压缩 --&gt;
                        &lt;nomunge&gt;false&lt;/nomunge&gt;&lt;!-- 是否进行代码混淆 --&gt;
                    &lt;/configuration&gt;
                &lt;/plugin&gt;
                &lt;plugin&gt;
                    &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
                    &lt;artifactId&gt;maven-war-plugin&lt;/artifactId&gt;
                    &lt;version&gt;2.4&lt;/version&gt;
                    &lt;configuration&gt;
                        &lt;!-- overlays的配置会从默认Profile继承，不需要再次声明 --&gt;
                        &lt;webResources&gt;
                            &lt;resource&gt;
                                &lt;!-- 这里必须引用压缩文件存放目录 --&gt;
                                &lt;directory&gt;${yui.compressed.dir}&lt;/directory&gt;
                            &lt;/resource&gt;
                        &lt;/webResources&gt;
                    &lt;/configuration&gt;
                &lt;/plugin&gt;
            &lt;/plugins&gt;
        &lt;/build&gt;
    &lt;/profile&gt;
&lt;/profiles&gt;</pre>
<div id="proguard-maven-plugin" class="blog_h3"><span class="graybg">压缩和混淆Java代码</span></div>
<pre class="crayon-plain-tag">&lt;plugin&gt;
    &lt;groupId&gt;com.github.wvengen&lt;/groupId&gt;
    &lt;artifactId&gt;proguard-maven-plugin&lt;/artifactId&gt;
    &lt;version&gt;2.0.8&lt;/version&gt;
    &lt;dependencies&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;net.sf.proguard&lt;/groupId&gt;
            &lt;artifactId&gt;proguard-base&lt;/artifactId&gt;
            &lt;version&gt;5.2&lt;/version&gt;
            &lt;scope&gt;runtime&lt;/scope&gt;
        &lt;/dependency&gt;
    &lt;/dependencies&gt;
    &lt;executions&gt;
        &lt;execution&gt;
            &lt;!-- 注意，不会对maven-war-plugin通过overlay得到的类进行任何处理，此时war已经打包完毕 --&gt;
            &lt;phase&gt;package&lt;/phase&gt;
            &lt;goals&gt;
                &lt;goal&gt;proguard&lt;/goal&gt;
            &lt;/goals&gt;
            &lt;configuration&gt;
                &lt;!-- 从文件读取ProGuard配置选项 --&gt;
                &lt;proguardInclude&gt;${project.basedir}/.proguard&lt;/proguardInclude&gt;
                &lt;!-- 直接指定ProGuard配置选项 --&gt;
                &lt;options&gt;
                    &lt;option&gt;-keep public class * { public protected *; }&lt;/option&gt;
                    &lt;option&gt;-dontoptimize&lt;/option&gt;
                &lt;/options&gt;
                &lt;!-- 
                    以下ProGuard选项自动设置：
                    -dontobfuscate，如果配置obfuscate
                    -verbose，如果以-X运行Maven
                --&gt;
                
                &lt;!-- JVM库一般不在Maven依赖列表中 --&gt;
                &lt;libs&gt;
                    &lt;lib&gt;${java.home}/lib/rt.jar&lt;/lib&gt;
                    &lt;lib&gt;${java.home}/lib/jsse.jar&lt;/lib&gt;
                &lt;/libs&gt;
                &lt;!-- 是否把Maven依赖作为库看待，默认true --&gt;
                &lt;includeDependency&gt;true&lt;/includeDependency&gt;
                &lt;!-- 当启用includeDependency时，进行细粒度的过滤控制 --&gt;
                &lt;exclusions&gt;
                    &lt;exclusion&gt;
                        &lt;groupId&gt;javax.inject&lt;/groupId&gt;
                        &lt;artifactId&gt;javax.inject&lt;/artifactId&gt;
                    &lt;/exclusion&gt;
                &lt;/exclusions&gt;
                &lt;!-- 执行代码混淆--&gt;
                &lt;obfuscate&gt;true&lt;/obfuscate&gt;
                
                &lt;!-- START
                    下面的配置，将把编译阶段得出的classes拷贝daoclasses_proguard_base，
                    然后把daoclasses_proguard_base作为输入目录；把classes作为输出目录
                --&gt;
                &lt;!-- 输入文件设置为编译好的target/classes目录 --&gt;
                &lt;injar&gt;classes&lt;/injar&gt;
                &lt;!-- 不匹配下面过滤器的文件，不会被处理，也不会进入classes --&gt;
                &lt;inFilter&gt;!cc/gmem/study/obfuscate/keep/**&lt;/inFilter&gt;
                &lt;!-- END --&gt;
                
                &lt;!-- START 
                    如上配置，如果加上下面这行设置，则classes保持编译阶段的原样，
                    处理后的结果存放到processed-classes
                --&gt;
                &lt;outjar&gt;processed-classes&lt;/outjar&gt;
                &lt;!-- END --&gt;
                
            &lt;/configuration&gt;
        &lt;/execution&gt;
    &lt;/executions&gt;
&lt;/plugin&gt;</pre>
<p>使用Spring、Hibernate的工程，混淆配置如下：</p>
<pre class="crayon-plain-tag">&lt;execution&gt;
    &lt;phase&gt;process-classes&lt;/phase&gt;
    &lt;goals&gt;
        &lt;goal&gt;proguard&lt;/goal&gt;
    &lt;/goals&gt;
    &lt;configuration&gt;
        &lt;injar&gt;classes&lt;/injar&gt;
        &lt;options&gt;
            &lt;option&gt;
                -libraryjars ${java.home}/lib/rt.jar
                -keep public class * { public protected *; }
                -keepparameternames  #例如SpringMVC，可能依赖于方法参数的名称
                -keepattributes Exceptions,InnerClasses,Signature,*Annotation*,EnclosingMethod
                -keepclassmembers class * implements java.io.Serializable {
                    static final long serialVersionUID;
                    private static final java.io.ObjectStreamField[] serialPersistentFields;
                    private void writeObject(java.io.ObjectOutputStream);
                    private void readObject(java.io.ObjectInputStream);
                    java.lang.Object writeReplace();
                    java.lang.Object readResolve();
                }
                -keepclassmembers class * {
                    @javax.annotation.Resource *;
                }
                -keepclassmembers class * {
                    @javax.inject.Inject *;
                }
                -keepclassmembers class * {
                    @org.springframework.beans.factory.annotation.Autowired *;
                }
            &lt;/option&gt;
        &lt;/options&gt;
    &lt;/configuration&gt;
&lt;/execution&gt;</pre>
<div class="blog_h3"><span class="graybg">spring boot</span></div>
<pre class="crayon-plain-tag">&lt;plugin&gt;
    &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
    &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;
    &lt;version&gt;2.0.0.RELEASE&lt;/version&gt;
    &lt;configuration&gt;
        &lt;!-- 指定入口点 --&gt;
        &lt;mainClass&gt;com.dangdang.digital.spring.data.redis.Application&lt;/mainClass&gt;
        &lt;layout&gt;JAR&lt;/layout&gt;
        &lt;!-- 将主资源文件目录加入到classpath中 --&gt;
        &lt;addResources&gt;true&lt;/addResources&gt;
    &lt;/configuration&gt;
    &lt;executions&gt;
        &lt;execution&gt;
            &lt;goals&gt;
                &lt;goal&gt;repackage&lt;/goal&gt;
            &lt;/goals&gt;
        &lt;/execution&gt;
    &lt;/executions&gt;
&lt;/plugin&gt;
&lt;!--
    打自包含包
    mvn clean package -P boot
    运行程序
    mvn spring-boot:run -P boot
--&gt;</pre>
<div class="blog_h3"><span class="graybg">集成docker</span></div>
<pre class="crayon-plain-tag">&lt;plugin&gt;
    &lt;groupId&gt;com.spotify&lt;/groupId&gt;
    &lt;artifactId&gt;dockerfile-maven-plugin&lt;/artifactId&gt;
    &lt;version&gt;1.4.7&lt;/version&gt;
    &lt;executions&gt;
        &lt;execution&gt;
            &lt;id&gt;default&lt;/id&gt;
            &lt;goals&gt;
                &lt;goal&gt;build&lt;/goal&gt;
                &lt;goal&gt;push&lt;/goal&gt;
            &lt;/goals&gt;
        &lt;/execution&gt;
    &lt;/executions&gt;
    &lt;configuration&gt;
        &lt;!-- Docker上下文目录，寻找其中的Dockerfile文件，不支持非Dockerfile的文件名 --&gt;
        &lt;contextDirectory&gt;.&lt;/contextDirectory&gt;
        &lt;!-- 打包的Docker镜像名称 --&gt;
        &lt;repository&gt;docker.gmem.cc/prometheus/dubbo_exporter&lt;/repository&gt;
        &lt;tag&gt;${project.version}&lt;/tag&gt;
        &lt;!-- 构建时参数，必须在Dockerfile中声明对应的ARG --&gt;
        &lt;buildArgs&gt;
            &lt;JAR_FILE&gt;target/${project.build.finalName}.jar&lt;/JAR_FILE&gt;
        &lt;/buildArgs&gt;
    &lt;/configuration&gt;
&lt;/plugin&gt;</pre>
<div class="blog_h3"><span class="graybg">集成helm</span></div>
<p>该插件支持打包、部署、删除，不支持和Chart仓库交互。 </p>
<pre class="crayon-plain-tag">&lt;plugin&gt;
    &lt;groupId&gt;org.microbean&lt;/groupId&gt;
    &lt;artifactId&gt;helm-maven-plugin&lt;/artifactId&gt;
    &lt;version&gt;2.8.2.1.1.1&lt;/version&gt;
    &lt;executions&gt;
        &lt;execution&gt;
            &lt;id&gt;default&lt;/id&gt;
            &lt;phase&gt;package&lt;/phase&gt;
            &lt;goals&gt;
                &lt;goal&gt;package&lt;/goal&gt;
            &lt;/goals&gt;
            &lt;configuration&gt;
                &lt;!-- Chart定义存在的目录 --&gt;
                &lt;chartContentsUri&gt;file:${project.basedir}/.chart&lt;/chartContentsUri&gt;
                &lt;!-- 打包后的Chart存放位置 --&gt;
                &lt;chartTargetUri&gt;file:${project.build.directory}/charts/${project.artifactId}.tgz&lt;/chartTargetUri&gt;
            &lt;/configuration&gt;
        &lt;/execution&gt;
    &lt;/executions&gt;
&lt;/plugin&gt;</pre>
<div class="blog_h3"><span class="graybg">集成bash</span></div>
<pre class="crayon-plain-tag">&lt;plugin&gt;
    &lt;groupId&gt;com.atlassian.maven.plugins&lt;/groupId&gt;
    &lt;artifactId&gt;bash-maven-plugin&lt;/artifactId&gt;
    &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;
    &lt;configuration&gt;
        &lt;script&gt;
            helm delete dubbo-exporter --purge
            helm install target/charts/dubbo_exporter.tgz --name=dubbo-exporter
        &lt;/script&gt;
    &lt;/configuration&gt;
&lt;/plugin&gt;</pre>
<div class="blog_h3"><span class="graybg">Groovy + Java 联合</span></div>
<p>添加插件仓库：</p>
<pre class="crayon-plain-tag">&lt;pluginRepository&gt;
    &lt;id&gt;bintray&lt;/id&gt;
    &lt;name&gt;Groovy Bintray&lt;/name&gt;
    &lt;url&gt;https://dl.bintray.com/groovy/maven&lt;/url&gt;
    &lt;releases&gt;
        &lt;updatePolicy&gt;never&lt;/updatePolicy&gt;
    &lt;/releases&gt;
    &lt;snapshots&gt;
        &lt;enabled&gt;false&lt;/enabled&gt;
    &lt;/snapshots&gt;
&lt;/pluginRepository&gt;</pre>
<p> 添加插件：</p>
<pre class="crayon-plain-tag">&lt;plugin&gt;
    &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;
    &lt;version&gt;3.8.1&lt;/version&gt;
    &lt;configuration&gt;
        &lt;compilerId&gt;groovy-eclipse-compiler&lt;/compilerId&gt;
    &lt;/configuration&gt;
    &lt;dependencies&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.codehaus.groovy&lt;/groupId&gt;
            &lt;artifactId&gt;groovy-eclipse-compiler&lt;/artifactId&gt;
            &lt;version&gt;3.3.0-01&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.codehaus.groovy&lt;/groupId&gt;
            &lt;artifactId&gt;groovy-eclipse-batch&lt;/artifactId&gt;
            &lt;version&gt;2.5.6-01&lt;/version&gt;
        &lt;/dependency&gt;
    &lt;/dependencies&gt;
&lt;/plugin&gt;</pre>
<p>Groovy的依赖仍然需要添加：</p>
<pre class="crayon-plain-tag">&lt;dependency&gt;
  &lt;groupId&gt;org.codehaus.groovy&lt;/groupId&gt;
  &lt;artifactId&gt;groovy&lt;/artifactId&gt;
  &lt;classifier&gt;indy&lt;/classifier&gt;
  &lt;version&gt;2.5.6&lt;/version&gt;
&lt;/dependency&gt;</pre>
<p>关于源码目录结构：</p>
<ol>
<li>默认情况下，可以把所有Groovy代码都放到src/main/java目录</li>
<li>如果src/main/java下至少有一个文件，则可以将Groovy代码放到src/main/groovy目录 </li>
</ol>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/maven-pom-demo">Maven POM文件配置示例</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/maven-pom-demo/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Maven知识集锦</title>
		<link>https://blog.gmem.cc/maven-faq</link>
		<comments>https://blog.gmem.cc/maven-faq#comments</comments>
		<pubDate>Mon, 01 Jun 2009 03:49:07 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[FAQ]]></category>
		<category><![CDATA[Maven]]></category>

		<guid isPermaLink="false">http://blog.gmem.cc/?p=1037</guid>
		<description><![CDATA[<p>基本概念 项目对象模型（Project Object Model,POM）：描述项目的基本信息：声明构件的坐标、如何进行构建、声明项目的依赖存放在项目根目录下的pom.xml中。POM包含了项目的一切元数据——具体IDE相关的元数据，例如.project、.classpth、.settings，均不再需要，IDE的Maven插件可以根据POM自动生成 构件（Artifact）：每个项目都抽象为一个构件。多模块项目（父子项目）包含多个构件构件主要有三类：普通包、插件、原型 坐标：每个构件使用坐标来唯一识别，坐标主要包括3个维：组标识（groupId）、构件标识（artifactId）、版本号（version），另外两个次要维度为：打包方式（packaging）和分类器（classifer）。构件的字符串表示通常为：groupId:artifactId:version。构件的文件命名格式：artifactId-version-classifer.packaging，例如spring-jdbc-3.0.6.RELEASE.jar开发中的版本，version往往有SNAPSHOT后缀，例如0.0.1-SNAPSHOT打包方式为可选字段，包括pom、jar、war、ear、maven-plugin、maven-archetype等，默认为jar分类器为可选字段，通常可用于区分构件对应的jdk版本 依赖（Dependency）：描述当前构件的生命周期的某个范围（Scope）内依赖的其他构件，有效的范围取值包括： compile：默认值，适用于所有阶段，随项目发布 provided：期望容器或者jdk提供的类，例如对servlet-api的依赖 runtime：仅仅在运行时使用，例如具体的jdbc驱动，可用于单元测试 test：仅仅在单元测试时使用 system：不在Repository中查找，需要指定本地路径，一般不用 传递性依赖（Transitive dependencies）：由于每个构件都可以依赖于其他构件，因此可以形成依赖的传递链 可选依赖（optional）：标记为可选的依赖，不构成依赖传递链条 插件（Plugin）：Maven本身是一个框架，一切具体的工作都由插件完成，每个插件包含多个目标。插件本身也是一种构件，存放于仓库（Repository）中，即用即下载 目标（Goal）：目标是明确定义的工作单元，可以被Maven单独调用完成特定的操作，或者作为生命周期某阶段的一个步骤，与其他目标一起被调用。目标的字符串表示为：pluginId:goalId Mojo：即“Maven plain Old Java Object”，就是插件的目标的另外一个称呼 <a class="read-more" href="https://blog.gmem.cc/maven-faq">[...]</a></p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/maven-faq">Maven知识集锦</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h1"><span class="graybg">基本概念</span></div>
<ol>
<li>项目对象模型（Project Object Model,POM）：描述项目的基本信息：声明构件的坐标、如何进行构建、声明项目的依赖存放在项目根目录下的pom.xml中。POM包含了项目的一切元数据——具体IDE相关的元数据，例如.project、.classpth、.settings，均不再需要，IDE的Maven插件可以根据POM自动生成</li>
<li>构件（Artifact）：每个项目都抽象为一个构件。多模块项目（父子项目）包含多个构件构件主要有三类：<span style="background-color: #c0c0c0;">普通包、插件、原型</span></li>
<li>坐标：每个构件使用坐标来唯一识别，坐标主要包括3个维：<span style="background-color: #c0c0c0;">组标识（groupId）、构件标识（artifactId）、版本号（version）</span>，另外两个次要维度为：<span style="background-color: #c0c0c0;">打包方式（packaging）和分类器（classifer）</span>。构件的字符串表示通常为：<span style="background-color: #c0c0c0;">groupId:artifactId:version</span>。构件的文件命名格式：<span style="background-color: #c0c0c0;">artifactId-version-classifer.packaging</span>，例如spring-jdbc-3.0.6.RELEASE.jar<span style="background-color: #c0c0c0;"><br /></span>开发中的版本，version往往有SNAPSHOT后缀，例如0.0.1-SNAPSHOT<br />打包方式为可选字段，包括pom、jar、war、ear、maven-plugin、maven-archetype等，默认为jar<br />分类器为可选字段，通常可用于区分构件对应的jdk版本</li>
<li>依赖（Dependency）：描述当前构件的生命周期的某个<span style="background-color: #c0c0c0;">范围（Scope）</span>内依赖的其他构件，有效的范围取值包括：
<ol>
<li>compile：默认值，适用于所有阶段，随项目发布</li>
<li>provided：期望容器或者jdk提供的类，例如对servlet-api的依赖</li>
<li>runtime：仅仅在运行时使用，例如具体的jdbc驱动，可用于单元测试</li>
<li>test：仅仅在单元测试时使用</li>
<li>system：不在Repository中查找，需要指定本地路径，一般不用</li>
</ol>
</li>
<li>传递性依赖（Transitive dependencies）：由于每个构件都可以依赖于其他构件，因此可以形成依赖的传递链</li>
<li>可选依赖（optional）：标记为可选的依赖，不构成依赖传递链条</li>
<li>插件（Plugin）：Maven本身是一个框架，一切具体的工作都由插件完成，每个插件包含多个目标。插件本身也是一种构件，存放于仓库（Repository）中，即用即下载</li>
<li>目标（Goal）：目标是明确定义的<span style="background-color: #c0c0c0;">工作单元</span>，可以被Maven单独调用完成特定的操作，或者作为<span style="background-color: #c0c0c0;">生命周期某阶段的一个步骤</span>，与其他目标一起被调用。<br />目标的字符串表示为：<span style="background-color: #c0c0c0;">pluginId:goalId</span></li>
<li>Mojo：即“Maven plain Old Java Object”，就是插件的目标的另外一个称呼</li>
<li>Maven生命周期（Lifecycle）：生命周期是包含在一个<span style="background-color: #c0c0c0;">项目构建中的一系列有序的阶段</span>。Maven支持多种生命周期，包括<span style="background-color: #c0c0c0;">清理生命周期、默认生命周期、站点生命周期</span>。主要被使用的是默认生命周期</li>
<li>阶段（Phase）：生命周期包含一系列的阶段（Phase），下图展示运行mvn clean install时，包含的阶段：<br /><img class="aligncenter size-full wp-image-9266" src="https://blog.gmem.cc/wp-content/uploads/2009/06/maven-phases.png" alt="maven-phases" width="456" height="320" />对于不同项目类型，同一阶段的行为可以不同，例如，一般项目的package阶段是打jar包，web项目则是打war包。<br />插件的<span style="background-color: #c0c0c0;">目标可以附在特定Maven生命周期阶段上，并随着生命周期的推进而被调用</span>。例如对于jar项目：jar:jar目标就默认附在package阶段， surefire:test则附在test阶段。位于后面的阶段被运行时，<span style="background-color: #c0c0c0;">前置阶段自动被运行</span>，例如对于<pre class="crayon-plain-tag">mvn package</pre> 命令，不仅仅运行打包阶段，编译、测试阶段都会执行（clean不会执行，因为clean不属于默认生命周期的组成部分）。如果某个阶段运行失败，<span style="background-color: #c0c0c0;">后续默认阶段不会运行</span></li>
<li>仓库（Repository）：首次添加依赖包，或者首次运行某个Maven命令（即调用插件），会看到控制台上显示正在下载各种组件，下载都是从仓库获得构件的。安装Maven时，仅安装2M左右的核心框架，所有构件（依赖包、插件），均在需要时到“仓库”下载。构件相对于仓库的根目录的文件路径的形式为：<br /><pre class="crayon-plain-tag">/groupId/artifactId/version/artifactId-version.packaging</pre> <br />其中，如果groupId有点号，则分解为多级目录，例如：<br /><pre class="crayon-plain-tag">/cn/com/sparknet/hibernate-tools/0.0.1/hibernate-tools-0.0.1.jar</pre> <br />构件所在目录，还包括构件的<span style="background-color: #c0c0c0;">pom文件、构件源码文件、javadoc文件</span>等内容</li>
<li>本地仓库：本地仓库存放已经下载的构件，避免重复下载；也存放本地构建的构件默认位置为<pre class="crayon-plain-tag">~/.m2/repository</pre> </li>
<li>索引：仓库，特别是中央仓库非常大，索引用于加快构件查询的速度。仓库的管理者（软件，例如nexus）负责生成和维护索引，使用者下载索引</li>
<li>原型（Archtype）：原型是预定义的模板，可以用来<span style="background-color: #c0c0c0;">生成项目的骨架</span>。一般的，新建Maven项目均要指定其原型。原型也是构件的一种，可以自己开发原型，满足不同项目的需要</li>
<li>构件版本的命名规则：<span style="background-color: #c0c0c0;">主版本、次版本、增量版本之间使用点号.间隔</span>，如果有<span style="background-color: #c0c0c0;">里程碑版本号，则与前者使用-间隔</span>。例如：<pre class="crayon-plain-tag">1.1.1-beta-1</pre> <br />主版本，一般表示重大架构的变更，比如Spring2与Spring3<br />次版本，表示大范围功能的增加和变化，比如Spring2.5比2.0增加注解功能<br />增量版本，一般表示重大缺陷的修复<br />里程碑版本，一般表示一个里程碑，比如alpha、beta等<br />通常增量版本、里程碑版本是可选的</li>
<li>快照（SNAPSHOT）版本：是一种特殊的里程碑版本，表示开发的最新状态，快照版本不指向一个特定的构件，而是指向其最新发布的引用。在仓库中，快照版本具有特殊的命名规则，例如：<pre class="crayon-plain-tag">mom-tools-0.0.1-20111028.003655-3.jar</pre> 表示mom-tools构件的0.0.1的快照版本，此版本在2011年10月28日发布，是0.01快照的第3次发布。如果快照<span style="background-color: #c0c0c0;">仓库的updatePolicy设置为always</span>，那么每次构建都会自动从快照仓库下载最新的发布。使用<pre class="crayon-plain-tag">mvn -U</pre> 参数，也可以强制从仓库下载最新发布</li>
</ol>
<div class="blog_h1"><span class="graybg">Maven设置settings.xml的格式</span></div>
<p>下面是一个简单的示例：</p>
<pre class="crayon-plain-tag">&lt;settings&gt;
    &lt;localRepository&gt;D:\JavaEE\maven\maven_repository&lt;/localRepository&gt;
    &lt;pluginGroups&gt;&lt;/pluginGroups&gt;
    &lt;offline&gt;false&lt;/offline&gt;
    &lt;servers&gt;
        &lt;server&gt;
            &lt;id&gt;spkntNexus&lt;/id&gt;
            &lt;username&gt;wangzhen&lt;/username&gt;
            &lt;password&gt;lavender&lt;/password&gt;
        &lt;/server&gt;
    &lt;/servers&gt;
    &lt;proxies /&gt;&lt;mirrors /&gt;
    &lt;profiles&gt;
        &lt;profile&gt;
            &lt;id&gt;spkntDev&lt;/id&gt;
            &lt;activation&gt;
                &lt;activeByDefault&gt;false&lt;/activeByDefault&gt;
                &lt;jdk&gt;1.5&lt;/jdk&gt;
                &lt;os&gt;&lt;name&gt;Windows XP&lt;/name&gt;&lt;/os&gt;
            &lt;/activation&gt;
            &lt;repositories&gt;
                &lt;repository&gt;
                    &lt;id&gt;nexus&lt;/id&gt;
                    &lt;url&gt;http://192.168.1.15:28080/nexus/content/groups/public/&lt;/url&gt;
                    &lt;releases&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/releases&gt;
                    &lt;snapshots&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/snapshots&gt;
                &lt;/repository&gt;
            &lt;/repositories&gt;
            &lt;pluginRepositories&gt;&lt;/pluginRepositories&gt;
        &lt;/profile&gt;
    &lt;/profiles&gt;
    &lt;activeProfiles&gt;
        &lt;activeProfile&gt;spkntDev&lt;/activeProfile&gt;
    &lt;/activeProfiles&gt;
&lt;/settings&gt;</pre>
<p>各元素说明如下：</p>
<ol>
<li>settings是固定的根元素</li>
<li>localRepository指定本地仓库的文件系统路径</li>
<li>pluginGroups 使用某插件时，如果不指定groupId，使用此元素下面定义的值</li>
<li>proxies 联网时的代理设置</li>
<li>servers 服务器设置，主要是用户名密码，与pom的distributionManagement配合使用，可完成构件的远程发布</li>
<li>mirrors 为某些仓库配置镜像</li>
<li>profiles 包含可选参数的配置，通过激活/禁用特定的profile，灵活的切换配置</li>
<li>profile/activation 设置profile自动激活规则，比如运行于WindowsXp则激活</li>
<li>profile/repositories 定义远程仓库</li>
<li>profile/pluginRepositories 定义远程插件仓库</li>
<li>activeProfiles 设置启用的profile</li>
</ol>
<div class="blog_h1"><span class="graybg">pom.xml文件基本格式</span></div>
<p>下面是一个简单的示例：</p>
<pre class="crayon-plain-tag">&lt;project&gt;
    &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
    &lt;groupId&gt;sparknet.training&lt;/groupId&gt;
    &lt;artifactId&gt;mockito&lt;/artifactId&gt;
    &lt;version&gt;0.0.1&lt;/version&gt;
    &lt;packaging&gt;jar&lt;/packaging&gt;
    &lt;name&gt;mockito&lt;/name&gt;
    &lt;parent&gt;mockito-parent&lt;/parent&gt;
    &lt;modules/&gt;
    &lt;properties&gt;
        &lt;spring-version&gt;3.0.6&lt;/spring-version&gt;
    &lt;/properties&gt;
    &lt;dependencies&gt;&lt;/dependencies&gt;
    &lt;build&gt;
        &lt;directory/&gt;
        &lt;sourceDirectory/&gt;
        &lt;resources/&gt;
        &lt;plugins&gt;&lt;/plugins&gt;
        &lt;pluginManagement&gt;&lt;/pluginManagement&gt;
    &lt;/build&gt;
    &lt;profiles&gt;&lt;/profiles&gt;
    &lt;distributionManagement/&gt;
&lt;/project&gt;</pre>
<p>各元素说明如下：</p>
<ol>
<li>project元素是pom固定的根元素</li>
<li>groupId、artifactId、version、packaging定义了构件坐标</li>
<li>parent、modules元素用于多maven模块的项目：parent在模块中使用，指向其父项目；modules在父项目中使用，声明其包含的模块列表</li>
<li>properties用于自定义属性，或者覆盖系统属性。自定义的属性可以在pom中以<pre class="crayon-plain-tag">${propertyName}</pre> 的形式引用</li>
<li>dependencies用于管理当前构件的依赖</li>
<li>build 与构建过程相关：
<ol>
<li>directory用于指定输出目录，类似有outputDirectory、testOutputDirectory</li>
<li>sourceDirectory用于指定源码目录，默认src/main/java</li>
<li>testSourceDirectory用于指定测试源码目录，默认src/test/java</li>
<li>resources用于指定资源目录，默认src/main/resources。资源目录可以指定排除/包含规则，比如排除：**/*.java</li>
<li>testResources用于指定测试资源目录，默认src/test/resources</li>
<li>plugins用于指定/<span style="background-color: #c0c0c0;">覆盖</span>插件配置、定义新的插件调用，比如指定源码级别、指定源码编码方式。注意，如果profiles覆盖外面（即build/plugins/plugin/...）的某个插件的配置属性，必须<span style="background-color: #c0c0c0;">明确声明新的属性值，否则，会从外面带入属性值</span></li>
<li>pluginManagement 用于在父子项目中，指定默认的插件配置</li>
<li>profiles用于定义可选的配置信息，可以定义上述大部分内容，通过<pre class="crayon-plain-tag">mvn -P</pre> 参数可以激活profile</li>
<li>distributionManagement 定义构件的发布管理</li>
</ol>
</li>
</ol>
<div class="blog_h1"><span class="graybg">常见问题</span></div>
<div class="blog_h2"><span class="graybg">如何控制插件目标的执行顺序？</span></div>
<p>目标都可以附着到<span style="background-color: #c0c0c0;">其支持的Maven生命周期阶段</span>，在插件配置中声明类似下面的片段：</p>
<pre class="crayon-plain-tag">&lt;execution&gt;
    &lt;phase&gt;package&lt;/phase&gt;
    &lt;goals&gt;
        &lt;goal&gt;single&lt;/goal&gt;
    &lt;/goals&gt;
    ...</pre>
<p>即可指定目标在哪个阶段执行，这样，早期阶段中的目标自然先执行。</p>
<p>如果两个目标在声明在同一阶段执行，那么，它们在POM中声明的顺序，决定了它们执行的顺序，<span style="background-color: #c0c0c0;">先声明的先执行</span>。</p>
<div class="blog_h2"><span class="graybg">如何调用插件目标</span></div>
<p>自己编写的插件，调用时需要提供完成的插件坐标：</p>
<pre class="crayon-plain-tag"># 插件坐标                                          # 目标名称
mvn cc.gmem.yun.maven.plugins:maven-archetype-plugin:create-from-project</pre>
<p>同时，也需要在build/plugins中声明自己编写的插件版本。</p>
<div class="blog_h2"><span class="graybg">如果将插件目标绑定到生命周期阶段</span></div>
<p>下面的例子示意如何将create-from-project目标绑定到install阶段：</p>
<pre class="crayon-plain-tag">&lt;build&gt;
    &lt;plugins&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;cc.gmem.yun.maven.plugins&lt;/groupId&gt;
            &lt;artifactId&gt;maven-archetype-plugin&lt;/artifactId&gt;
            &lt;version&gt;3.1.1&lt;/version&gt;
            &lt;configuration&gt;
                &lt;propertyFile&gt;archetype.properties&lt;/propertyFile&gt;
                &lt;archetypePostPhase&gt;install&lt;/archetypePostPhase&gt;
            &lt;/configuration&gt;
            &lt;executions&gt;
                &lt;execution&gt;
                    &lt;phase&gt;install&lt;/phase&gt;
                    &lt;goals&gt;
                        &lt;goal&gt;create-from-project&lt;/goal&gt;
                    &lt;/goals&gt;
                &lt;/execution&gt;
            &lt;/executions&gt;
        &lt;/plugin&gt;
    &lt;/plugins&gt;
&lt;/build&gt; </pre>
<div class="blog_h2"><span class="graybg">通过命令行分析依赖冲突</span></div>
<p>例如要分析构件spring-data-mongodb的冲突，执行：</p>
<pre class="crayon-plain-tag">#显示从解析后依赖树中忽略的冲突    # 包含在结果里的构件
                                                  # [groupId]:[artifactId]:[type]:[version]
                                                  # 支持通配符，:::*-SNAPSHOT 表示所有快照构件                   
mvn dependency:tree -Dverbose  -P dang -Dincludes=*:spring-data-mongodb

# 输出示例：
# [INFO] com.dangdang.digital.read:media-cms:war:1.0.0
# [INFO] +- com.dangdang.base:account-api:jar:1.1.0:compile
# [INFO] |  \- com.dangdang.base:framework:jar:1.0.5:compile
# [INFO] |     \- org.springframework:spring-data-mongodb:jar:1.0.0.M5:compile
# [INFO] \- org.springframework.data:spring-data-mongodb:jar:1.1.1.RELEASE:compile

# 可以看到通过account-api获得的传递依赖，和直接指定的1.1.1版本依赖冲突</pre>
<div class="blog_h2"><span class="graybg">依赖调解（Dependency Mediation）规则</span></div>
<p>传递性依赖导致的版本冲突，如下面的例子，出现cglib包的冲突，如何调解？</p>
<p><img class="aligncenter size-full wp-image-9259" src="https://blog.gmem.cc/wp-content/uploads/2009/06/dep-mediation.png" alt="dep-mediation" width="85%" /></p>
<p>&nbsp;</p>
<p>自动调解规则：</p>
<ol>
<li>最近路径优先原则，即从当前构件到冲突构件的路径长度短者优先</li>
<li>最先声明原则，即在POM中声明顺序靠前者优先（2.0.9+）</li>
</ol>
<p>手工调解：在POM中声明传递性依赖的排除。通常开源的工具包向后兼容（Backwards compatibility），我们倾向于排除低版本的依赖</p>
<div class="blog_h2"><span class="graybg">如何强制通过公司私有仓库下载构件</span></div>
<p>可以使用镜像解决，把公司私有仓库设置为其它所有仓库的镜像：</p>
<pre class="crayon-plain-tag">&lt;mirrors&gt;
    &lt;mirror&gt;
        &lt;!-- 创建一个名为maven的镜像，它是central仓库的镜像，对central的访问自动 转给它--&gt;
        &lt;id&gt;maven&lt;/id&gt;
        &lt;mirrorOf&gt;central&lt;/mirrorOf&gt;&lt;!-- 可以使用通配符 * --&gt;
        &lt;url&gt;http://repo1.maven.org/maven2&lt;/url&gt;
    &lt;/mirror&gt;
&lt;/mirrors&gt;</pre>
<div class="blog_h2"><span class="graybg">执行Maven命令时报错java.lang.OutOfMemoryError</span></div>
<p>设置环境变量：set MAVEN_OPTS=-Xms128m -Xmx512m<br /> 或者修改mvn.bat。<br /> 在Eclipse中运行时，可以修改Run Configurations，增加JVM参数</p>
<div class="blog_h2"><span class="graybg">Eclipse打包时，如何使用工作空间的项目代码，而不是到仓库下载</span></div>
<p>在Run Configuration中勾选“Resolve Workspace artifacts”</p>
<div class="blog_h2"><span class="graybg">使用Nexus，客户端无法下载索引</span></div>
<p>报错：Unable to update index for...解决步骤：</p>
<ol>
<li>Nexus修复索引</li>
<li>Nexus配置计划任务，定期发布索引：<br /> <a href="/wp-content/uploads/2009/06/publish-index-nexus-task.jpg"><img class="alignnone size-full wp-image-1045" src="https://blog.gmem.cc/wp-content/uploads/2009/06/publish-index-nexus-task.jpg" alt="publish-index-nexus-task" width="95%" /></a></li>
<li>客户端：删除%MAVEN_REPO_PATH%/.cache目录。重新尝试更新索引</li>
</ol>
<div class="blog_h2"><span class="graybg">如何创建一个多模块的Maven项目</span></div>
<p>先创建容器项目：创建简单项目，packaging设置为pom<br /> 容器项目点击右键：Maven - New Maven Module Project</p>
<div class="blog_h2"><span class="graybg">解决Maven官方仓库过慢的问题</span></div>
<p>修改Maven设置，添加速度较快的镜像：</p>
<pre class="crayon-plain-tag">&lt;mirrors&gt;
    &lt;mirror&gt;
        &lt;id&gt;google-maven-central&lt;/id&gt;
        &lt;name&gt;Google Maven Central&lt;/name&gt;
        &lt;url&gt;https://maven-central.storage.googleapis.com&lt;/url&gt;
        &lt;mirrorOf&gt;central&lt;/mirrorOf&gt;
    &lt;/mirror&gt;
    &lt;mirror&gt;
        &lt;id&gt;oschina&lt;/id&gt;
        &lt;mirrorOf&gt;central&lt;/mirrorOf&gt;
        &lt;name&gt;OSChina&lt;/name&gt;
        &lt;url&gt;http://maven.oschina.net/content/groups/public/&lt;/url&gt;
    &lt;/mirror&gt;
&lt;/mirrors&gt;</pre>
<div class="blog_h2"><span class="graybg">如何设置网络代理</span></div>
<p>如果你的机器无法连接到Maven仓库，可以使用网络代理：</p>
<pre class="crayon-plain-tag">&lt;proxies&gt;
    &lt;proxy&gt;
        &lt;id&gt;zircon&lt;/id&gt;
        &lt;active&gt;true&lt;/active&gt;
        &lt;protocol&gt;http&lt;/protocol&gt;
        &lt;host&gt;127.0.0.1&lt;/host&gt;
        &lt;port&gt;8087&lt;/port&gt;
        &lt;nonProxyHosts&gt;127.0.0.1|192.168.0.*&lt;/nonProxyHosts&gt;
    &lt;/proxy&gt;
&lt;/proxies&gt;</pre>
<p>代理类型一般使用http，我尝试了socks5，发现无法连通，不知道什么原因。 </p>
<div class="blog_h2"><span class="graybg">Java 8下基于aspectj-maven-plugin构建报错</span></div>
<div class="blog_h3"><span class="graybg">报错信息</span></div>
<p>[ERROR] Missing message: configure.incompatibleComplianceForSource in: org.aspectj.ajdt.ajc.messages<br /> &lt;unknown source file&gt;:&lt;no line information&gt;</p>
<div class="blog_h3"><span class="graybg">解决方案</span></div>
<p>升级AspectJ到1.8.8，aspectj-maven-plugin到1.8，然后修改后者的插件配置：</p>
<pre class="crayon-plain-tag">&lt;configuration&gt;
    &lt;source&gt;${java.version}&lt;/source&gt;
    &lt;target&gt;${java.version}&lt;/target&gt;
    &lt;!-- 添加下面这个配置项 --&gt;
    &lt;complianceLevel&gt;${java.version}&lt;/complianceLevel&gt;
&lt;/configuration&gt;</pre>
<div class="blog_h2"><span class="graybg">启用Resolve Workspace artifacts导致maven-war-plugin报错</span></div>
<div class="blog_h3"><span class="graybg">报错信息</span></div>
<p>[ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.1.1:war (default-war) on project ***: Failed to copy file for artifact [***:jar:0.0.1-SNAPSHOT:compile]: /home/alex/JavaEE/projects/idea/pems-trunk/comm-tools/target/classes (Is a directory) -&gt; [Help 1]</p>
<div class="blog_h3"><span class="graybg">原因和解决</span></div>
<p>maven-war-plugin版本过低，需要在POM中明确的声明使用新版：</p>
<pre class="crayon-plain-tag">&lt;plugin&gt;
    &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
    &lt;artifactId&gt;maven-war-plugin&lt;/artifactId&gt;
    &lt;version&gt;2.6&lt;/version&gt;
&lt;/plugin&gt;</pre>
<div class="blog_h2"><span class="graybg">dependencies could not be resolved</span></div>
<p>无法找到依赖，会显示依赖的名字，其中的占位符${}应该已经被替换为实际值。</p>
<div class="blog_h3"><span class="graybg">os.detected.classifier</span></div>
<p>需要配置扩展，否则此属性不可用。</p>
<pre class="crayon-plain-tag">&lt;build&gt;
    &lt;extensions&gt;
        &lt;extension&gt;
            &lt;groupId&gt;kr.motd.maven&lt;/groupId&gt;
            &lt;artifactId&gt;os-maven-plugin&lt;/artifactId&gt;
            &lt;version&gt;1.6.1&lt;/version&gt;
        &lt;/extension&gt;
    &lt;/extensions&gt;
&lt;/build&gt;</pre>
<div class="blog_h1"><span class="graybg">常用命令</span></div>
<div class="blog_h2"><span class="graybg">mvn</span></div>
<div class="blog_h3"><span class="graybg">常用子命令</span></div>
<table class=" fixed-word-wrap full-width">
<thead>
<tr>
<td style="width: 35%; text-align: center;">子命令</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>clean</td>
<td>清理项目下已经生成的类、资源文件。此步骤不会自动执行</td>
</tr>
<tr>
<td>test</td>
<td>执行已经定义的单元测试</td>
</tr>
<tr>
<td>compile</td>
<td>编译源码到target目录</td>
</tr>
<tr>
<td>package</td>
<td>打包为jar war ear到 target目录</td>
</tr>
<tr>
<td>install</td>
<td>安装到本地仓库</td>
</tr>
<tr>
<td>deploy</td>
<td>部署到远程仓库，需要结合maven配置</td>
</tr>
<tr>
<td>dependency:copy-dependencies<br /> -Dmdep.useRepositoryLayout=true</td>
<td>导出依赖包，保持repository中的目录结构</td>
</tr>
<tr>
<td>dependency:copy-dependencies<br /> -DincludeScope=compile</td>
<td>导出依赖包，到target目录，只包含compile范围的依赖</td>
</tr>
<tr>
<td>archetype:create</td>
<td>从原型创建项目，例如创建web项目：</td>
</tr>
</tbody>
</table>
<pre class="crayon-plain-tag">mvn archetype:create 
  -DgroupId=? -DartifactId=? -Dpackaging=jar 
  -DarchetypeArtifactId=maven-archetype-webapp </pre>
<p>eclipse:eclipse生成Eclipse项目结构，包括.classpath等元数据，例如：</p>
<pre class="crayon-plain-tag">mvn eclipse:eclipse –Dwtpversion=1.0 </pre>
<p>help:describe描述一个插件，打印其用法，例如：<pre class="crayon-plain-tag">mvn help:describe -Dplugin=help </pre> help:effective-settings查看当前实际有效的settingshelp:effective-pom查看当前项目实际起作用的pom，包含默认配置，因此比pom.xml全面dependency:resolve<br />dependency:tree打印依赖assembly:assembly生成可执行jar包</p>
<div class="blog_h3"><span class="graybg">常用选项</span></div>
<div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 35%; text-align: center;">选项</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>-U</td>
<td>强制更新快照依赖</td>
</tr>
<tr>
<td>-o</td>
<td>离线模式，不去联网获取依赖</td>
</tr>
<tr>
<td>-X -e</td>
<td>启用DEBUG模式</td>
</tr>
<tr>
<td>-Dmaven.test.skip=true<br />-Dmaven.test.skip</td>
<td>跳过测试</td>
</tr>
<tr>
<td>-Dcheckstyle.skip</td>
<td>跳过代码风格检查</td>
</tr>
<tr>
<td>-Dmaven.test.failure.ignore=true</td>
<td>即使测试失败，生命周期后续阶段仍然执行</td>
</tr>
<tr>
<td>-P pname</td>
<td>启用指定的Profile</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">命令示例</span></div>
<p>执行下面的命令，可以交互式的生成新的多模块工程：</p>
<pre class="crayon-plain-tag">mvn archetype:generate -DarchetypeGroupId=org.codehaus.mojo.archetypes -DarchetypeArtifactId=pom-root
     -DarchetypeVersion=RELEASE 
# 根据提示输入组、构件标识符以及版本号
# 注意packaging要设置为pom，表示创建一个多模块容器工程</pre>
<p><a id="new-maven-module"></a>要创建多模块工程的一个子模块，执行：</p>
<pre class="crayon-plain-tag"># 进入容器工程所在目录，创建模块
cd parent-artifact-name
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp
     -DarchetypeVersion=RELEASE  </pre>
<p>在任意目录执行如下命令，可以获得当前使用的全局、用户设置文件的路径：</p>
<pre class="crayon-plain-tag">mvn -X | grep 'Reading.*settings\s'
# [DEBUG] Reading global settings from /Users/Alex/JavaEE/maven/3.3.9/conf/settings.xml
# [DEBUG] Reading user settings from /Users/Alex/.m2/settings.xml</pre>
</div>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/maven-faq">Maven知识集锦</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/maven-faq/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
