如何使用另一场战争中的类文件

Posted

技术标签:

【中文标题】如何使用另一场战争中的类文件【英文标题】:how to use class file from another war 【发布时间】:2012-04-28 15:08:52 【问题描述】:

我们有两个不同的 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

【问题讨论】:

在运行战争)? 是的,它发生在编译时。 【参考方案1】:

您可以定义 war 插件以生成一个单独的 jar 文件,该文件可通过基于 configuration 的分类器获得:

<configuration>
  ..
  <attachClasses>true</attachClasses>
  <archiveClasses>true</archiveClasses>
</configuration>

之后,您可以在其他项目中将其用作单独的依赖项。但是最好用它制作一个单独的jar模块。

【讨论】:

如何将我的控制器折射到单独的 jar 文件中?任何相同的链接。 我认为这对于只需要一个战争来运行它的验收测试的项目来说是可以的。 请参考详细链接dzone.com/articles/mavens-war-overlays-how-manage 使用jar添加&lt;classifier&gt;classes&lt;/classifier&gt;到依赖引用【参考方案2】:

你正在做的是使用WAR file overlay。 Maven 确实支持这一点。不过……

WAR 插件在package 阶段执行。在此阶段之前执行的任何插件,例如 Java 编译器(在编译阶段运行),都不会看到 WAR 插件提取的任何文件。 (如果有帮助,这里是reference list of all Maven phases)

如果您有能力重构您的项目结构,最好的方法是使用您的控制器创建一个普通的 JAR 项目,并让两个 WAR 将此 JAR 作为依赖项拉入。

如果由于某些原因您不能这样做,则需要执行以下操作:

    将 WAR 插件配置为在早于 compile 的阶段运行,例如 generate-resources,并确保它将覆盖类文件提取到 $project.build.outputDirectory

    您还可以使用 Maven 依赖插件的 unpack 目标将类从依赖 WAR 提取到 $project.build.outputDirectory

但如果可能的话,我建议您将控制器重构为单独的 JAR,这样会更容易且更易于维护。

【讨论】:

【参考方案3】:

将控制器放入一个新的 jar 项目中,并从您的 web 项目中创建依赖关系到此控制器。

【讨论】:

【参考方案4】:

将以下插件添加到您的 share 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 模块。

【讨论】:

【参考方案5】:

Java EE 可见性标准规定,当将一场战争中的类打包为 EAR 时,它们不应该可供另一场战争中的类使用。大多数容器都会严格执行这一点。

您应该将希望共享的代码放入 JAR 中,并将其作为依赖项包含在您要使用的战争中。

【讨论】:

我同意,这是正确的方法。多亏了 maven,非常容易【参考方案6】:

在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 以及战争。

在依赖项目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 文件中的分类器名称必须相同

【讨论】:

以上是关于如何使用另一场战争中的类文件的主要内容,如果未能解决你的问题,请参考以下文章

如何打赢一场商业战争?小米联合创始人:你得先了解它的本质

使用 Jenkins 将战争文件部署到 Tomcat 的推荐方法?

如何将文件夹添加到由 maven cargo 插件启动的 Tomcat 容器的类路径中

我如何使用部署在战争 Spring Boot 应用程序中的 mysql jdbc 驱动程序

如何修改 Jboss 部署战争文件中的文件?

我们可能已见证第一场人工智能战争