有没有办法将mywebapp-1.0-SNAPSHOT-classes.jar从maven-war-plugin中的attachClasses配置更改为mywebapp-1.0-SNAPSHOT.jar?

时间:2013-07-01 10:40:57

标签: java maven java-ee jar war

根据maven-war-plugin FAQ

  

如果无法将类移动到另一个项目,则可以使用以下配置将webapp中包含的类和资源作为“附加”工件与分类器一起部署:

<project>
  ...
  <artifactId>mywebapp</artifactId>
  <version>1.0-SNAPSHOT</version>
  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.3</version>
        <configuration>
          <attachClasses>true</attachClasses>
        </configuration>
      </plugin>
    </plugins>
  </build>
  ...
</project>
  

这将导致部署两个工件: mywebapp-1.0-SNAPSHOT.war和mywebapp-1.0-SNAPSHOT-classes.jar

有没有办法可以获得 mywebapp-1.0-SNAPSHOT.jar而不是mywebapp-1.0-SNAPSHOT-classes.jar

更新:

我希望生成war和jar。虽然我能够通过应用Changing packaging based on active profile in pom中提到的配置文件来实现这一点。但我很想知道上面的问题。

5 个答案:

答案 0 :(得分:3)

简答:没有,你不能。

通过查看maven-war-plugin来源,在WarMojo.java(第292行)中,您可以看到只需修改 maven-war-plugin 就无法满足您的要求配置:

    protected static File getTargetFile( File basedir, String finalName, String classifier, String type )
    {
        if ( classifier == null )
        {
            classifier = "";
        }
        else if ( classifier.trim().length() > 0 && !classifier.startsWith( "-" ) )
        {
            classifier = "-" + classifier;
        }

        return new File( basedir, finalName + classifier + "." + type );
    }

由于classesClassifier参数默认为"classes",因此您无法修改此行为:classifier永远不会是null

您可以在文件生成后重命名该文件,也可以修改 maven-war-plugin 的源代码,并将其用作自定义插件。

作为最后的考虑,不建议使用null classesClassifier :它可能会产生误导。我不知道你的项目要求。

希望它有所帮助。

答案 1 :(得分:2)

与您想要做的最接近的方法是使用<classesClassifier>

作为

    <project>
  ...
  <artifactId>mywebapp</artifactId>
  <version>1.0-SNAPSHOT</version>
  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.3</version>
        <configuration>
          <attachClasses>true</attachClasses>
          <classesClassifier>someClassifier</classesClassifier>
        </configuration>
      </plugin>
    </plugins>
  </build>
  ...
</project>

但这种方法总是将分类器设为your_jar-classifier.jar,如果您创建并清空或间隔标记,则默认为-classes

另一方面,通过使用archiveClasses而不是attachClasses,您可以在战争的WEB-INF\lib(没有分类器)中找到JAR,但是没有{{1将生成。

答案 2 :(得分:2)

尝试使用以下pom.xml部分配置您的网络应用<build>,看它是否符合您的需求:

...
<build>
  <plugins>
    <plugin>
      <artifactId>maven-jar-plugin</artifactId>
      <executions>
        <execution>
          <id>create-jar</id>
          <phase>package</phase>
          <goals>
            <goal>jar</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>build-helper-maven-plugin</artifactId>
      <executions>
        <execution>
          <id>attach-jar</id>
          <phase>package</phase>
          <goals>
            <goal>attach-artifact</goal>
          </goals>
          <configuration>
            <artifacts>
              <artifact>
                <file>${project.build.directory}/${project.build.finalName}.jar</file>
              </artifact>
            </artifacts>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
...

本节要求Maven显式创建jar,然后将创建的jar附加到构建中,以便install阶段可以将生成的工件复制到本地存储库中。 / p>

答案 3 :(得分:0)

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <archiveClasses>true</archiveClasses>                    
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <version>3.0.0</version>
            <executions>
                <execution>
                    <id>attach-jar</id>
                    <phase>package</phase>
                    <goals>
                        <goal>attach-artifact</goal>
                    </goals>
                    <configuration>
                        <artifacts>
                            <artifact>
                                <file>${project.build.directory}/${project.build.finalName}/WEB-INF/lib/${project.build.finalName}.jar</file>
                            </artifact>
                        </artifacts>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

结合上面提到的一些想法似乎对我有用。 &lt; archiveClasses&gt; (as explained here)导致在WAR文件中生成所需的JAR,并且attach-artifact目标将该文件提取为工件。

答案 4 :(得分:0)

Maven的一般理念是一个POM生成一个工件。这意味着从您的项目中获取Jar的最干净,最“Maveny”的方法是将Java代码和Webapp项分成由父项目组合在一起的两个模块。

因此潜在的项目层次结构可能是:

mywebapp-parent/ -> Contains all dependency info, project version
  mywebapp/ -> Creates Jar
  mywebapp-web/ -> Depends on mywebapp, Creates War