3

根据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

更新::

我希望同时生成战争和罐子。尽管我可以通过应用基于 pom 中的活动配置文件更改包装中提到的配置文件来做到这一点。但我很想知道上述问题。

4

5 回答 5

3

简短的回答:,你不能。

通过查看WarMojo.java (第 292 行)中的 maven-war-plugin 源代码,您可以看到仅通过修改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:它可能会产生误导。我不知道你的项目要求。

希望能帮助到你。

于 2013-07-10T09:49:17.827 回答
2

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

...
<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阶段可以将生成的工件复制到本地存储库中。

于 2013-07-05T20:19:02.903 回答
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你会在战争中找到你想要的JAR WEB-INF\lib(没有分类器),但不会WEB-INF\classes生成。

于 2013-07-03T16:53:16.863 回答
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>

结合上面提到的一些想法似乎对我有用。<archiveClasses>(如此处所解释的)导致在 WAR 文件中生成所需的 JAR,并且 attach-artifact 目标将该文件提取为工件。

于 2017-09-27T14:37:37.383 回答
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
于 2018-03-16T17:41:10.857 回答