【问题标题】:Maven - Generate Jar and WarMaven - 生成 Jar 和 War
【发布时间】:2012-06-07 10:40:06
【问题描述】:

我有一个 CXF WS 项目,我会在另一个项目中使用它,我会在 Web 项目中使用这个 WS,但我不知道如何生成 Jar 文件。

请问你有什么想法或例子吗?

谢谢

【问题讨论】:

标签: java maven maven-2 cxf maven-plugin


【解决方案1】:

maven-war-plugin 支持创建仅包含类的单独工件。

http://maven.apache.org/plugins/maven-war-plugin/war-mojo.html

参见“attachClasses”参数。无需添加 jar 插件或弄乱包装。只需将战争插件添加到 pluginManagement 并打开它。

但是,我担心这不是您想要的。要使用 CXF Web 服务,您需要一个客户端。要获取客户端,请遵循 CXF 示例中的说明,了解如何生成和使用客户端存根。为此,您需要一个单独的 Maven 项目。

【讨论】:

【解决方案2】:

尝试将其添加到您的构建部分:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <executions>
        <execution>
          <id>make-a-jar</id>
          <phase>compile</phase>
          <goals>
            <goal>jar</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

【讨论】:

  • 看来我必须将阶段更改为打包。如果设置为编译,pom.xml上有错误。
  • 这行得通,但是如何将 maven-jar-plugin 生成的 *.jar 包含在 maven-war-plugin 构建的 war 包中?
【解决方案3】:

在war项目的pom.xml中添加以下内容。

&lt;attachClasses&gt;true&lt;/attachClasses&gt; 配置war插件

<groupId>com.yourorg.foobar</groupId>
<artifactId>hello-world</artifactId>
<packaging>war</packaging>
<version>1.0</version>
<name>hello</name>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.0.0</version>
            <configuration>
                <attachClasses>true</attachClasses>
            </configuration>
        </plugin>
    </plugins>
</build>

在要导入jar of war项目的项目的pom.xml中添加以下内容

&lt;classifier&gt;classes&lt;/classifier&gt; 到依赖导入

<dependency>
    <groupId>com.yourorg.foobar</groupId>
    <artifactId>hello-world</artifactId>
    <version>1.0</version>
    <classifier>classes</classifier>
</dependency>

【讨论】:

  • 有没有办法改变jar文件的名字?
【解决方案4】:

这是通过属性实现它的一种方法。 默认情况下它会生成一个war文件,当你想要jar时,只需设置属性即可。

mvn install -Dp.type=jar

pom.xml

<properties>
   <p.type>war</p.type>
</properties>
<packaging>${p.type}</packaging>

【讨论】:

    【解决方案5】:

    这应该有效:

    <!-- Maven JAR plugin -->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <executions>
            <execution>
                <id>jar-services-provided</id>
                <phase>compile</phase>
                <goals>
                    <goal>jar</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    
    <!-- Install the jar locally -->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-install-plugin</artifactId>
        <executions>
            <execution>
                <phase>install</phase>
                <goals>
                    <goal>install-file</goal>
                </goals>
                <configuration>
                    <packaging>jar</packaging>
                    <artifactId>${project.artifactId}</artifactId>
                    <groupId>${project.groupId}</groupId>
                    <version>${project.version}</version>
                    <file>
                        ${project.build.directory}/${project.artifactId}-${project.version}.jar
                    </file>
                </configuration>
            </execution>
        </executions>
    </plugin>
    

    取自this blog

    【讨论】:

      【解决方案6】:

      考虑你的maven项目打包到战争

      <project xmlns="http://maven.apache.org/POM/4.0.0"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      
          <modelVersion>4.0.0</modelVersion>
      
          <groupId>com.sample</groupId>
          <artifactId>sample</artifactId>
          <version>1.0-SNAPSHOT</version>
          <packaging>war</packaging>
      

      将以下执行添加到 maven-install-plugin

          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-install-plugin</artifactId>
              <version>2.5.2</version>
              <executions>
                  <execution>
                      <phase>package</phase>
                      <configuration>
                          <packaging>jar</packaging>
                          <file>${project.build.directory}\${artifactId}-${version}.jar</file>
                      </configuration>
                      <goals>
                          <goal>install-file</goal>
                      </goals>
                  </execution>
              </executions>
          </plugin>
      

      【讨论】:

      • 我想生成一个战争,但只是得到了一个 .jar,但是按照您上面的建议添加 war 会有所帮助!谢谢
      • 在这种情况下,maven-install-plugin 创建/安装也是一个 jar 文件。使用 maven-war-plugin 创建 war 文件
      【解决方案7】:

      mvn package 除非你的project's packaging 不是jar。然后,您需要jar plugin 中的add an execution,如plugin's usage page 所述以及第一个答案所示。更好的是,如果它不是 jar,则将其分为两个模块:一个是包含可重用代码的 jar,另一个是使用它的东西。

      【讨论】:

        【解决方案8】:

        实现这一点的最好方法是通过使用 Maven 程序集插件,您还可以控制 jar 的最终名称:

        在你的 pom.xml 中添加以下插件:

             <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <version>2.4</version>
                    <configuration>
                        <descriptors>
                            <descriptor>assembly.xml</descriptor>
                        </descriptors>
                        <finalName>${artifactId}-${version}</finalName>
                        <appendAssemblyId>false</appendAssemblyId>
                    </configuration>
                </plugin>
        

        程序集.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}</directory>
              <outputDirectory>/</outputDirectory>
              <includes>
                <include>**/*</include>
              </includes>
            </fileSet>
          </fileSets>
        </assembly>
        

        您终于可以使用以下命令构建项目了:

        mvn clean package assembly:单次安装

        【讨论】:

          猜你喜欢
          • 2014-01-03
          • 1970-01-01
          • 2017-10-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多