簡體   English   中英

如何使用來自另一場戰爭的類文件

[英]how to use class file from another war

我們有兩個不同的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構建失敗:

[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>

之后,您可以將其用作其他項目中的單獨依賴項。 但最好將一個單獨的jar模塊從它中取出。

你正在做的是使用WAR文件覆蓋 Maven確實支持這一點。 然而...

WAR插件在package階段執行。 在此階段之前執行的任何插件(例如Java編譯器(在編譯階段運行))都不會看到WAR插件已提取的任何文件。 (如果有幫助,這里是所有Maven階段參考列表

如果您能夠重構項目結構,最好的方法是使用控制器創建一個普通的JAR項目,並讓兩個WAR將此JAR作為依賴項。

如果有一些原因導致您無法執行此操作,則需要執行以下操作:

  1. 將WAR插件配置為在compile之前的階段運行,例如generate-resources ,並確保將overlay類文件提取到${project.build.outputDirectory}

  2. 您還可以使用Maven Dependency Plugin的解包目標將依賴WAR中的類提取到${project.build.outputDirectory}

但我確實建議,如果可以將控制器重構為單獨的JAR,則更容易,更易於維護。

將控制器放入一個新的jar項目,並從webprojects到這個控制器的依賴關系。

將以下插件添加到您的共享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模塊添加依賴項。

Java EE可見性標准規定,當一個戰爭中的類被打包為EAR時,它們不應該可用於另一場戰爭中的類。 大多數容器都會嚴格執行此操作。

您應該將要共享的代碼放入JAR中,並將其作為您要使用的戰爭中的依賴項包含在內。

在戰爭項目中包含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文件中的分類器名稱必須相同

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM