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

时间:2012-04-17 09:20:13

标签: java maven maven-plugin maven-3

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

6 个答案:

答案 0 :(得分:19)

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

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

之后,您可以将其用作其他项目中的单独依赖项。但是最好将一个独立的jar模块从它中分离出来。

答案 1 :(得分:9)

您正在使用的是WAR file overlay。 Maven确实支持这一点。然而...

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

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

如果有某些原因导致您无法执行此操作,则需要执行以下操作:

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

  2. 您还可以使用Maven Dependency Plugin的unpack目标将依赖关系WAR中的类提取到${project.build.outputDirectory}

  3. 但我确实建议,如果可以将控制器重构为单独的JAR,它会更容易,更易于维护。

答案 2 :(得分:4)

将控制器放入一个新的jar项目中,并将webprojects的依赖关系转换为此控制器。

答案 3 :(得分:2)

将以下插件添加到您的共享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模块添加依赖项。

答案 4 :(得分:1)

Java EE可见性标准规定,当一个战争中的类被打包为EAR时,它们不应该在另一个战争中的类中可用。大多数容器都会严格执行此操作。

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

答案 5 :(得分:1)

在战争项目中,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>

这将在目标文件夹中创建你的-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文件中的分类器名称必须相同