【问题标题】:Maven: generating a WAR of the whole project, and a JAR of a specific packageMaven:生成整个项目的WAR,以及特定包的JAR
【发布时间】:2013-01-26 01:23:09
【问题描述】:

我使用模型-视图-控制器模式开发了一个 webapp。 model 包代表应用程序的核心 API,可以独立使用。 controllerview 包使用 model 包来生成 web 应用程序。

问题: 我希望能够构建一个仅包含 model 包的 JAR,以及三个包的 WAR。而且我想将这三个包保存在同一个项目中。与独立 JAR 相比,webapp WAR 将包括补充库。 我怎么能用 Maven 实现这一点?会有使用例如两个单独的 pom.xml 文件的解决方案吗? (因为据我所知,你不能在 pom.xml 中选择两个packaging 选项)

(我见过this question,但我真的希望我的三个包属于同一个项目,并且属于同一个目录。)

另外,我的项目使用了经典的 webapp 结构(这里简化了):

my-app
-- pom.xml
-- src
----- main/
-------- java/
----------- model/
----------- view/
----------- controller/
-------- webapp/
---------- WEB-INF/
-------------classes/

我能否设法在经典target/ 目录中生成JAR,在经典src/main/webapp/ 目录中生成webapp? (并且,根据要求,包括不同的库)

感谢您的帮助。

【问题讨论】:

    标签: java maven


    【解决方案1】:

    看看Maven Assembly Plugin

    有了它,您可以根据需要拥有尽可能多的不同程序集描述符,每个都使用自己的打包方案文件集和依赖关系。


    这是您的 pom.xml 的示例插件配置:

    <build>
      <plugins>
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <descriptors>
                   <descriptor>src/main/assembly/model.xml</descriptor>
                </descriptors>
            </configuration>
         </plugin>
      </plugins>
    </build>
    

    以及 model jar (src/main/assembly/model.xml) 的示例程序集描述符

    <assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
      <id>model</id>
      <formats>
        <format>jar</format>
      </formats>
      <includeBaseDirectory>false</includeBaseDirectory>
      <fileSets>
        <fileSet>
          <directory>${project.build.outputDirectory}/model</directory>
          <outputDirectory>/</outputDirectory>
          <includes>
            <include>**/*</include>
          </includes>
        </fileSet>
      </fileSets>
    </assembly>
    

    运行 mvn clean package assembly:single 将从您的项目 pom.xmlmy-app-model.jar 生成标准 my-app.war 文件 在目标包中。

    【讨论】:

    • 谢谢。我会调查它,但它看起来是我需要的。您能否提供一个我的案例所需的配置示例? (或者你可以告诉我自己做我的工作^^)
    • 哇,太好了,谢谢! (没有足够的声誉来支持你:/)
    • 那么,我如何只包含一些特定的库?
    • 将它们声明为war项目的正常依赖项,并在程序集描述符中声明exclude unnecessary artifacts
    • 非常感谢您的帮助。
    【解决方案2】:

    我认为您会更喜欢“war”作为项目的默认打包方式,更简单的方法是使用 maven-jar-plugin:

           <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-jar-plugin</artifactId>
               <version>2.4</version>
               <executions>
                   <execution>
                       <phase>package</phase>
                       <goals>
                           <goal>jar</goal>
                       </goals>
                       <configuration>
                           <classifier>weibo4j</classifier>
                           <includes>
                               <include>model/**</include>
                           </includes>
                       </configuration>
                   </execution>
               </executions>
           </plugin>
    

    【讨论】:

    • 对于我的具体情况,看起来也是一个很好的解决方案,而 Antony 的解决方案提供了更高的模块化。谢谢你们俩。
    猜你喜欢
    • 2014-02-05
    • 2012-06-07
    • 2017-10-13
    • 2014-10-06
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    相关资源
    最近更新 更多