maven-war-plugin 喜欢ヅ旅行 2022-04-25 08:08 177阅读 0赞 ## Apache Maven WAR Plugin ## The WAR Plugin is responsible for collecting all artifact dependencies, classes and resources of the web application and packaging them into a web application archive. “打包“这个词听起来比较土,比较正式的说法应该是”构建项目软件包“,具体说就是将项目中的各种文件,比如源代码、编译生成的字节码、配置文件、文档,按照规范的格式生成归档,最常见的当然就是JAR包和WAR包了,复杂点的例子是Maven官方下载页面的分发包,它有自定义的格式,方便用户直接解压后就在命令行使用。作为一款”打包工具“,Maven自然有义务帮助用户创建各种各样的包,规范的JAR包和WAR包自然不再话下,略微复杂的自定义打包格式也必须支持,本文就介绍一些常用的打包案例以及相关的实现方式,除了前面提到的一些包以外,你还能看到如何生成源码包、Javadoc包、以及从命令行可直接运行的CLI包。 任何一个Maven项目都需要定义POM元素packaging(如果不写则默认值为jar)。顾名思义,该元素决定了项目的打包方式。实际的情形中,如果你不声明该元素,Maven会帮你生成一个JAR包;如果你定义该元素的值为war,那你会得到一个WAR包;如果定义其值为POM(比如是一个父模块),那什么包都不会生成。除此之外,Maven默认还支持一些其他的流行打包格式,例如ejb3和ear。你不需要了解具体的打包细节,你所需要做的就是告诉Maven,”我是个什么类型的项目“,这就是约定优于配置的力量。 对应于同样的package生命周期阶段,Maven为jar项目调用了maven-jar-plugin,为war项目调用了maven-war-plugin,换言之,packaging直接影响Maven的构建生命周期。了解这一点非常重要,特别是当你需要自定义打包行为的时候,你就必须知道去配置哪个插件。 ## war plugin的常用配置参数 ## ### archiveClasses配置项 ### 该配置的值为true|false,默认是false。表示是否将class进行打包。 正常情况下war类型的工程,java代码编译后的类文件会放到WEB-INF/classes目录下面,散装。 当该参数配置为true时,会将所有的class打包为一个jar,jar的名字与war的名字一致(除了后缀)。然后把这个jar放到WEB-INF/lib目录下,此时WEB-INF/classes目录下是空的。 ### attachClasses配置项 ### 该配置的值为true|false,默认是false。表示在发布war包的时候是否同时发布一个jar包(只有classes,不包含页面相关文件)。 正常情况下war类型的工程,当我们执行install或者deploy的时候build出一个war包,安装到本地或者发布到远程。 当该参数配置为true时,除了war包外还会多出一个jar包,不过该jar包的classifier默认为classes。 ### overlays配置节点 ### overlays配置的作用是,将指定war包中的内容与当前项目进行合并。合并策略:如果存在同名冲突,则使用当前项目中的文件。 overlay的具体配置项(include|exclude)可以指定包含或者排除特定模式的文件。 ## 配置示例 ## ### 多war合并 ### archiveClasses和attachClasses参数可以同时配置为true。此时打包文件中含有lib,不含classes。发布时会同时发布classifier为classes的jar包。 如果当前工程A需要从B工程的war包中合入页面文件,同时代码中也要使用B的类文件。工程B包含配置如下: <table> <tbody> <tr> <td> <pre> </pre> <p>1</p> <p>2</p> <p>3</p> <p>4</p> <p>5</p> <p>6</p> <p>7</p> <p>8</p> </td> <td> <pre> </pre> <p><plugin></p> <p><groupId>org.apache.maven.plugins</groupId></p> <p><artifactId>maven-war-plugin</artifactId></p> <p><version>2.6</version></p> <p><configuration></p> <p><attachClasses>true</attachClasses></p> <p></configuration></p> <p></plugin></p> </td> </tr> </tbody> </table> 工程A包含配置如下: <table> <tbody> <tr> <td> <pre> </pre> <p>1</p> <p>2</p> <p>3</p> <p>4</p> <p>5</p> <p>6</p> <p>7</p> <p>8</p> <p>9</p> <p>10</p> <p>11</p> <p>12</p> <p>13</p> <p>14</p> <p>15</p> <p>16</p> <p>17</p> <p>18</p> <p>19</p> <p>20</p> <p>21</p> <p>22</p> <p>23</p> <p>24</p> <p>25</p> <p>26</p> <p>27</p> <p>28</p> <p>29</p> <p>30</p> <p>31</p> <p>32</p> </td> <td> <pre> </pre> <p><dependencies></p> <p><dependency></p> <p><groupId>groupB</groupId></p> <p><artifactId>B</artifactId></p> <p><version>1.0-SNAPSHOT</version></p> <p><classifier>classes</classifier></p> <p><scope>provided</scope></p> <p></dependency></p> <p><dependency></p> <p><groupId>groupB</groupId></p> <p><artifactId>B</artifactId></p> <p><version>1.0-SNAPSHOT</version></p> <p><type>war</type></p> <p></dependency></p> <p></dependencies></p> <p><build></p> <p><plugins></p> <p><plugin></p> <p><groupId>org.apache.maven.plugins</groupId></p> <p><artifactId>maven-war-plugin</artifactId></p> <p><version>2.6</version></p> <p><configuration></p> <p><overlays></p> <p><overlay></p> <p><groupId>groupB</groupId></p> <p><artifactId>B</artifactId></p> <p></overlay></p> <p></overlays></p> <p></configuration></p> <p></plugin></p> <p></plugins></p> <p></build></p> </td> </tr> </tbody> </table> > 可注意如果同名的文件夹会进行合并,不合并空文件夹。 ### 把class文件打包成jar,怎么排除resources目录? ### 正常情况下war类型的工程,java代码编译后的类文件会放到WEB-INF/classes目录下面,散装。 当archiveClasses参数配置为true时,会将所有的class打包为一个jar,jar的名字与war的名字一致。然后把这个jar放到WEB-INF/lib目录下,此时WEB-INF/classes目录下是空的,但如果想在war包的WEB-INF/classes中保留logback.xml配置文件,该怎么做? <table> <tbody> <tr> <td> <pre> </pre> <p>1</p> <p>2</p> <p>3</p> <p>4</p> <p>5</p> <p>6</p> <p>7</p> <p>8</p> <p>9</p> <p>10</p> <p>11</p> <p>12</p> <p>13</p> <p>14</p> </td> <td> <pre> </pre> <p><plugin></p> <p><artifactId>maven-war-plugin</artifactId></p> <p><version>3.0.0</version></p> <p><configuration></p> <p><archiveClasses>true</archiveClasses></p> <p><webResources></p> <p><resource></p> <p><directory>src/main/resources</directory></p> <p><targetPath>WEB-INF/classes</targetPath></p> <p><filtering>true</filtering></p> <p></resource></p> <p></webResources></p> <p></configuration></p> <p></plugin></p> </td> </tr> </tbody> </table> ### 对项目进行动态打包,不同的环境使用不同的配置文件打包 ### demo 1 <table> <tbody> <tr> <td> <pre> </pre> <p>1</p> <p>2</p> <p>3</p> <p>4</p> <p>5</p> <p>6</p> <p>7</p> <p>8</p> <p>9</p> <p>10</p> <p>11</p> <p>12</p> <p>13</p> <p>14</p> <p>15</p> <p>16</p> <p>17</p> <p>18</p> <p>19</p> </td> <td> <pre> </pre> <p>project/</p> <p>`-- src</p> <p>|-- main</p> <p>| |-- java</p> <p>| |-- resources</p> <p>| | |-- local</p> <p>| | | |-- logback.xml</p> <p>| | | |-- spring-dataSource.xml</p> <p>| | | `-- variable.propertes</p> <p>| | |-- product</p> <p>| | | |-- logback.xml</p> <p>| | | |-- spring-dataSource.xml</p> <p>| | | `-- variable.propertes</p> <p>| | `-- qa</p> <p>| | |-- logback.xml</p> <p>| | |-- spring-dataSource.xml</p> <p>| | `-- variable.propertes</p> <p>| |-- webapp</p> <p>`-- test</p> </td> </tr> </tbody> </table> <table> <tbody> <tr> <td> <pre> </pre> <p>1</p> <p>2</p> </td> <td> <pre> </pre> <p>maven package –P local 开发环境</p> <p>maven package –P product 生产环境</p> </td> </tr> </tbody> </table> <table> <tbody> <tr> <td> <pre> </pre> <p>1</p> <p>2</p> <p>3</p> <p>4</p> <p>5</p> <p>6</p> <p>7</p> <p>8</p> <p>9</p> <p>10</p> <p>11</p> <p>12</p> <p>13</p> <p>14</p> <p>15</p> <p>16</p> <p>17</p> <p>18</p> <p>19</p> <p>20</p> <p>21</p> <p>22</p> <p>23</p> <p>24</p> <p>25</p> <p>26</p> <p>27</p> <p>28</p> <p>29</p> <p>30</p> <p>31</p> <p>32</p> <p>33</p> <p>34</p> <p>35</p> <p>36</p> <p>37</p> <p>38</p> <p>39</p> <p>40</p> <p>41</p> <p>42</p> <p>43</p> <p>44</p> <p>45</p> <p>46</p> <p>47</p> <p>48</p> <p>49</p> <p>50</p> <p>51</p> <p>52</p> <p>53</p> <p>54</p> <p>55</p> <p>56</p> <p>57</p> <p>58</p> <p>59</p> <p>60</p> <p>61</p> <p>62</p> <p>63</p> <p>64</p> </td> <td> <pre> </pre> <p><profiles></p> <p><profile></p> <p><id>local</id></p> <p><properties></p> <p><package.environment>local</package.environment></p> <p></properties></p> <p><activation></p> <p><activeByDefault>true</activeByDefault></p> <p></activation></p> <p></profile></p> <p><profile></p> <p><id>product</id></p> <p><properties></p> <p><package.environment>product</package.environment></p> <p></properties></p> <p></profile></p> <p></profiles></p> <p><build></p> <p><resources></p> <p><!-- class文件打包成jar包,排除相关配置文件和jrebel配置文件 --></p> <p><resource></p> <p><directory>src/main/resources</directory></p> <p><excludes></p> <p><exclude>local/*</exclude></p> <p><exclude>product/*</exclude></p> <p><exclude>rebel.xml</exclude></p> <p></excludes></p> <p><filtering>true</filtering></p> <p></resource></p> <p></resources></p> <p><plugins></p> <p><!-- 区别dev环境与生产环境logback.xml配置 --></p> <p><plugin></p> <p><groupId>org.apache.maven.plugins</groupId></p> <p><artifactId>maven-war-plugin</artifactId></p> <p><configuration></p> <p><archiveClasses>true</archiveClasses></p> <p><failOnMissingWebXml>false</failOnMissingWebXml></p> <p><webResources></p> <p><resource></p> <p><directory>src/main/resources/${package.environment}</directory></p> <p><filtering>true</filtering></p> <p><targetPath>WEB-INF/classes</targetPath></p> <p></resource></p> <p></webResources></p> <p></configuration></p> <p></plugin></p> <p><plugin></p> <p><groupId>org.apache.maven.plugins</groupId></p> <p><artifactId>maven-jar-plugin</artifactId></p> <p><executions></p> <p><execution></p> <p><id>default-jar</id></p> <p><phase>package</phase></p> <p><goals></p> <p><goal>jar</goal></p> <p></goals></p> <p></execution></p> <p></executions></p> <p></plugin></p> <p></plugins></p> <p></build></p> </td> </tr> </tbody> </table> demo 2 <table> <tbody> <tr> <td> <pre> </pre> <p>1</p> <p>2</p> <p>3</p> <p>4</p> <p>5</p> <p>6</p> <p>7</p> <p>8</p> <p>9</p> <p>10</p> <p>11</p> <p>12</p> <p>13</p> <p>14</p> <p>15</p> <p>16</p> <p>17</p> <p>18</p> <p>19</p> <p>20</p> </td> <td> <pre> </pre> <p>project/</p> <p>`-- src</p> <p>|-- main</p> <p>| |-- java</p> <p>| |-- env</p> <p>| | |-- dev</p> <p>| | | |-- log4j.properties</p> <p>| | | |-- spring-dataSource.xml</p> <p>| | | `-- variable.propertes</p> <p>| | |-- prod</p> <p>| | | |-- log4j.properties</p> <p>| | | |-- spring-dataSource.xml</p> <p>| | | `-- variable.propertes</p> <p>| | `-- qa</p> <p>| | |-- log4j.properties</p> <p>| | |-- spring-dataSource.xml</p> <p>| | `-- variable.propertes</p> <p>| |-- resources</p> <p>| `-- webapp</p> <p>`-- test</p> </td> </tr> </tbody> </table> <table> <tbody> <tr> <td> <pre> </pre> <p>1</p> <p>2</p> </td> <td> <pre> </pre> <p>mvn clean package -P dev</p> <p>mvn clean package -P qa</p> </td> </tr> </tbody> </table> <table> <tbody> <tr> <td> <pre> </pre> <p>1</p> <p>2</p> <p>3</p> <p>4</p> <p>5</p> <p>6</p> <p>7</p> <p>8</p> <p>9</p> <p>10</p> <p>11</p> <p>12</p> <p>13</p> <p>14</p> <p>15</p> <p>16</p> <p>17</p> <p>18</p> <p>19</p> <p>20</p> <p>21</p> <p>22</p> <p>23</p> <p>24</p> <p>25</p> <p>26</p> <p>27</p> <p>28</p> <p>29</p> <p>30</p> <p>31</p> <p>32</p> <p>33</p> <p>34</p> <p>35</p> <p>36</p> <p>37</p> <p>38</p> <p>39</p> <p>40</p> <p>41</p> <p>42</p> <p>43</p> <p>44</p> <p>45</p> <p>46</p> <p>47</p> <p>48</p> <p>49</p> <p>50</p> <p>51</p> <p>52</p> <p>53</p> <p>54</p> <p>55</p> <p>56</p> <p>57</p> <p>58</p> <p>59</p> <p>60</p> <p>61</p> <p>62</p> <p>63</p> <p>64</p> <p>65</p> <p>66</p> <p>67</p> <p>68</p> <p>69</p> <p>70</p> <p>71</p> <p>72</p> <p>73</p> <p>74</p> <p>75</p> <p>76</p> <p>77</p> <p>78</p> <p>79</p> <p>80</p> <p>81</p> <p>82</p> <p>83</p> <p>84</p> <p>85</p> <p>86</p> <p>87</p> <p>88</p> <p>89</p> <p>90</p> <p>91</p> <p>92</p> <p>93</p> <p>94</p> <p>95</p> <p>96</p> <p>97</p> <p>98</p> <p>99</p> <p>100</p> <p>101</p> <p>102</p> <p>103</p> <p>104</p> <p>105</p> <p>106</p> <p>107</p> <p>108</p> <p>109</p> <p>110</p> <p>111</p> <p>112</p> <p>113</p> <p>114</p> <p>115</p> <p>116</p> <p>117</p> <p>118</p> <p>119</p> <p>120</p> <p>121</p> <p>122</p> <p>123</p> <p>124</p> <p>125</p> <p>126</p> <p>127</p> <p>128</p> <p>129</p> <p>130</p> <p>131</p> </td> <td> <pre> </pre> <p><project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"</p> <p>xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"></p> <p><modelVersion>4.0.0</modelVersion></p> <p><packaging>war</packaging></p> <p><version>0.0.1-SNAPSHOT</version></p> <p><name>demo Maven Webapp</name></p> <p><groupId>webapp</groupId></p> <p><artifactId>webapp</artifactId></p> <p><scm></p> <p><connection>scm:svn:http://127.0.0.1/dummy</connection></p> <p><developerConnection>scm:svn:https://127.0.0.1/dummy</developerConnection></p> <p><tag>HEAD</tag></p> <p><url>http://127.0.0.1/dummy</url></p> <p></scm></p> <p><properties></p> <p><spring-version>3.1.0.RELEASE</spring-version></p> <p></properties></p> <p><build></p> <p><finalName>${final.name}</finalName></p> <p><plugins></p> <p><plugin></p> <p><groupId>org.apache.maven.plugins</groupId></p> <p><artifactId>maven-war-plugin</artifactId></p> <p><version>2.1.1</version></p> <p><configuration></p> <p><overlays></p> <p><overlay></p> <p><groupId>TransactionResource</groupId></p> <p><artifactId>TransactionResource</artifactId></p> <p><excludes></p> <p><exclude>WEB-INF/web.xml</exclude></p> <p></excludes></p> <p></overlay></p> <p></overlays></p> <p><webResources></p> <p><resource></p> <p><directory>${runtime.env}</directory></p> <p><targetPath>WEB-INF/classes</targetPath></p> <p></resource></p> <p></webResources></p> <p></configuration></p> <p></plugin></p> <p></plugins></p> <p></build></p> <p><dependencies></p> <p>……</p> <p></dependencies></p> <p><profiles></p> <p><profile></p> <p><id>dev</id></p> <p><activation></p> <p><activeByDefault>true</activeByDefault></p> <p></activation></p> <p><properties></p> <p><runtime.env>src/main/env/dev</runtime.env></p> <p><final.name>webapp</final.name></p> <p></properties></p> <p><dependencies></p> <p><dependency></p> <p><groupId>com.eightqiu</groupId></p> <p><artifactId>CodeCmns</artifactId></p> <p><version>0.0.1-SNAPSHOT</version></p> <p></dependency></p> <p></dependencies></p> <p></profile></p> <p><profile></p> <p><id>qa</id></p> <p><properties></p> <p><runtime.env>src/main/env/qa</runtime.env></p> <p><final.name>webapp_${buildNumber}</final.name></p> <p></properties></p> <p><build></p> <p><plugins></p> <p><plugin></p> <p><groupId>org.codehaus.mojo</groupId></p> <p><artifactId>buildnumber-maven-plugin</artifactId></p> <p><version>1.1</version></p> <p><executions></p> <p><execution></p> <p><phase>validate</phase></p> <p><goals></p> <p><goal>create</goal></p> <p></goals></p> <p></execution></p> <p></executions></p> <p><configuration></p> <p><format>{0,date,yyyyMMdd}</format></p> <p><items></p> <p><item>timestamp</item></p> <p></items></p> <p></configuration></p> <p></plugin></p> <p></plugins></p> <p></build></p> <p><reporting></p> <p><plugins></p> <p><plugin></p> <p><groupId>org.apache.maven.plugins</groupId></p> <p><artifactId>maven-javadoc-plugin</artifactId></p> <p><version>2.8.1</version></p> <p></plugin></p> <p></plugins></p> <p></reporting></p> <p><dependencies></p> <p><dependency></p> <p><groupId>com.eightqiu</groupId></p> <p><artifactId>CodeCmns</artifactId></p> <p><version>0.0.1-SNAPSHOT</version></p> <p><scope>provided</scope></p> <p></dependency></p> <p></dependencies></p> <p></profile></p> <p><profile></p> <p><id>prod</id></p> <p><properties></p> <p><runtime.env>src/main/env/prod</runtime.env></p> <p><final.name>webapp</final.name></p> <p></properties></p> <p><dependencies></p> <p><dependency></p> <p><groupId>com.eightqiu</groupId></p> <p><artifactId>CodeCmns</artifactId></p> <p><version>0.0.1-SNAPSHOT</version></p> <p><scope>provided</scope></p> <p></dependency></p> <p></dependencies></p> <p></profile></p> <p></profiles></p> <p></project></p> </td> </tr> </tbody> </table>
还没有评论,来说两句吧...