【问题标题】:how to generate jar and war both in project如何在项目中生成jar和war
【发布时间】:2012-04-28 17:39:55
【问题描述】:

我们有两个不同的项目。并且控制器在两个项目中几乎相同。

项目 A 里面有控制器。所以为它制造战争不是问题。

但是项目 B 需要控制器的项目 A 控制器的 jar。

任何人都可以告诉我如何从项目 A 的控制器生成可以在项目 B 中使用的 jar 文件吗?

【问题讨论】:

标签: maven maven-2 maven-plugin maven-3


【解决方案1】:

这种事情的默认解决方案是有两个独立的模块,一个用于战争,一个用于控制器模块。不要开始与 Maven 争吵。

【讨论】:

  • 你的意思是说我应该写两个pom文件,一个用于生成jar文件,另一个用于war文件?
  • 最好的办法是创建一个多模块构建,其中包含两个模块(战争、控制器)和一个父模块。
  • 但是你也可以使用我在这里描述的解决方案:stackoverflow.com/a/10189767/296328
  • 可以说,如果您需要 jar,则无论如何都应该将战争和业务逻辑代码分开。那就是我假设你想在战争之外重用代码......因此是罐子。
  • 问题不是业务逻辑,UI 真的很复杂,为此我们已经对控制器和 Web 模型对象进行了大量编码,并且该模型对象用于不同的门户,所以在这里我们必须移植从一个门户到另一个门户的完整控制器。
【解决方案2】:

保持项目 A 的包装为战争。将 maven jar 插件添加到项目 A 的 pom.xml 中。使用“mvn clean package jar:jar”构建项目。它将创建一个罐子和一个战争。

【讨论】:

    【解决方案3】:

    正如@Shashank 所指出的,您可以让 maven 也执行 maven-jar-plugin。但这只会创建一个 JAR,其中仅包含已编译的类,但不包含 webapp 源。

    在多模块项目中,只需一个简单的mvn clean install 命令,无需显式调用mvn clean install jar:jar,即可轻松实现:

    只需将maven-jar-plugin 添加到>build>plugins 并在“打包”阶段调用它:

    <project>
      <packaging>war</packaging>
      <!-- .. -->
      <build>
        <plugins>
          <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
              <classifier>classes</classifier>
            </configuration>
            <executions>
              <execution>
                <id>package-jar</id>
                <phase>package</phase>
                <goals>
                  <goal>jar</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <artifactId>maven-war-plugin</artifactId>
          </plugin>
        </plugins>
      </build>
    </project>
    

    这将创建一个大的 .war 和一个较小的 -classes.jar 工件。

    2017 年 6 月 15 日更新:另一方面,如果您需要 war 文件的精确副本(不仅是打包的 java 类),即被屏蔽为 JAR 文件,您可以使用 maven-dependency-plugin 和 maven-install-plugin 的组合来创建 WAR 的 JAR 副本。 (我恰好需要这样的解决方案——不要问为什么;))

    创建一个依赖于war模块的新模块:

    <project>
      <!-- ... -->
      <dependencies>
        <!-- ... -->
        <dependency>
          <groupId>your-group-id-here</groupId>
          <artifactId>your-war-artifact-id-here</artifactId>
          <version>${project.version}</version>
          <type>war</type>
        </dependency>
      </dependencies>
    
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
              <execution>
                <id>copy</id>
                <phase>package</phase>
                <goals>
                  <goal>copy</goal>
                </goals>
              </execution>
            </executions>
            <configuration>
              <artifactItems>
                <artifactItem>
                  <groupId>your-group-id-here</groupId>
                  <artifactId>your-war-artifact-id-here</artifactId>
                  <version>${project.version}</version>
                  <type>war</type>
                  <overWrite>true</overWrite>
                  <destFileName>jar-copy-of-war.jar</destFileName>
                </artifactItem>
              </artifactItems>
              <overWriteReleases>false</overWriteReleases>
              <overWriteSnapshots>true</overWriteSnapshots>
            </configuration>
          </plugin>
          <plugin>
            <artifactId>maven-install-plugin</artifactId>
            <executions>
              <execution>
                <id>install-copy-of-war</id>
                <phase>install</phase>
                <goals>
                  <goal>install-file</goal>
                </goals>
                <configuration>
                  <packaging>jar</packaging>
                  <classifier>copy-of-war</classifier>
                  <artifactId>${project.artifactId}</artifactId>
                  <groupId>your-group-id-here</groupId>
                  <version>${project.version}</version>
                  <file>${project.build.directory}/dependency/jar-copy-of-war.jar</file>
                  <generatePom>true</generatePom>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </project>
    

    这将创建一个战争副本,将其命名为“--copy-of-war.jar”,而“copy-of-war”是该模块的分类器。

    【讨论】:

      猜你喜欢
      • 2017-10-13
      • 2012-06-07
      • 2016-03-01
      • 1970-01-01
      • 2013-10-26
      • 1970-01-01
      • 1970-01-01
      • 2015-12-05
      • 1970-01-01
      相关资源
      最近更新 更多