我们有两个不同的 Web 应用程序,我们希望将一场战争的少数控制器扩展到另一场战争。
我们正在使用maven来构建项目。
为了包括战争,我们将其依赖性指定为
<dependency>
<groupId>com.abc.exchange</groupId>
<artifactId>employer</artifactId>
<version>2.3.M2-SNAPSHOT</version>
<type>war</type>
<scope>compile</scope>
</dependency>
无法构建类未找到异常。
任何人都可以帮助我如何实现这一目标吗?
我收到错误 maven build failed :
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project agent-war: Compilation failure: Compilation failure:
[ERROR] \projects\trunk_new\agent\src\main\java\com\platform\agent\web\AgentEmployeeController.java:[22,41] cannot find symbol
[ERROR] symbol : class EmployeeController
[ERROR] location: package com..platform.employer.web
您可以定义 war 插件来生成一个单独的 jar 文件,该文件可通过基于 配置的分类器获得:
<configuration>
...
<attachClasses>true</attachClasses>
<archiveClasses>true</archiveClasses>
</configuration>
之后,您可以通过将
<classifier>classes</classifier>
添加到依赖项引用中,将其用作其他项目中的单独依赖项。但最好用它制作一个单独的 jar 模块。
您正在做的是使用WAR 文件覆盖。 Maven 确实支持这一点。然而...
WAR 插件在
package
阶段执行。在此阶段之前执行的任何插件,例如 Java 编译器(在编译阶段运行),都不会看到 WAR 插件提取的任何文件。 (这里是所有 Maven 阶段的参考列表如果有帮助的话)
如果您有能力重构项目结构,最好的方法是使用控制器创建一个普通的 JAR 项目,并让两个 WAR 将此 JAR 作为依赖项拉入。
如果由于某种原因您无法执行此操作,您将需要执行以下操作:
将 WAR 插件配置为在
compile
之前的阶段运行,例如 generate-resources
,并确保它将覆盖类文件提取到 ${project.build.outputDirectory}
。您还可以使用 Maven 依赖项插件的 unpack 目标将依赖项 WAR 中的类提取到
${project.build.outputDirectory}
。但我确实建议如果可能的话将控制器重构为单独的 JAR,这样会更容易且更易于维护。
将控制器放入一个新的 jar 项目中,并从您的 web 项目中建立对该控制器的依赖关系。
将以下插件添加到您的共享maven war模块(用于同时创建war和jar工件):
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<id>make-a-jar</id>
<phase>compile</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.4</version>
<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>
然后将依赖项添加到您依赖的 Maven war 模块。
在war项目pom.xml中包含
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<attachClasses>true</attachClasses>
</configuration>
</plugin>
这将在目标文件夹中创建 your-project-0.0.1-SNAPSHOT-clases.jar 以及 war。
在依赖项目pom.xml中包含
<dependency>
<groupId>com.yourproject</groupId>
<artifactId>you-project</artifactId>
<version>0.0.1-SNAPSHOT</version>
<classifier>classes</classifier>
</dependency>
这对我有用。希望有帮助。
编辑:如果我们只想将一些类文件放入 jar 中,则将其添加到 pom.xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<id>make-a-jar</id>
<phase>compile</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classifier>classifier_name</classifier>
<includes>
<include>com/../..</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
在依赖项目pom.xml中包含
<dependency>
<groupId>com.yourproject</groupId>
<artifactId>you-project</artifactId>
<version>0.0.1-SNAPSHOT</version>
<classifier>classifier_name</classifier>
</dependency>
注意:两个 pom.xml 文件中的分类器名称必须相同
Java EE 可见性标准规定,当打包为 EAR 时,一场战争中的类不应可供另一场战争中的类使用。大多数容器都会严格执行这一点。
您应该将想要共享的代码放入 JAR 中,并将其作为依赖项包含在您想要使用的 war 中。