如果无法将类移动到另一个项目,则可以使用以下配置将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中提到的配置文件来实现这一点。但我很想知道上面的问题。
答案 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