<?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; POM</title>
	<atom:link href="https://blog.gmem.cc/tag/pom/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.gmem.cc</link>
	<description></description>
	<lastBuildDate>Wed, 06 May 2026 13:28:33 +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 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-69fb44239ce36295902109/] 指定资源文件目录并过滤 [crayon-69fb44239ce3d525059951/] 指定额外的源代码目录 [crayon-69fb44239ce40578565080/] 过滤资源文件 [crayon-69fb44239ce43851007586/] 配置目录链接（Linked Folder） [crayon-69fb44239ce45744868032/] 打包时生成*–sources.jar [crayon-69fb44239ce47784893824/] 打包时生成*–javadoc.jar [crayon-69fb44239ce49174694680/] 指定编译级别 [crayon-69fb44239ce4c841299964/] 启用对AspectJ的支持 [crayon-69fb44239ce4e424036473/] 指定源代码、资源文件的编码方式 [crayon-69fb44239ce50084638544/] 打包时拷贝所有依赖包 <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>
	</channel>
</rss>
