![](/img/trans.png)
[英]How to call a class in war file from another class outside the war file?
[英]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作為依賴項。
如果有一些原因導致您無法執行此操作,則需要執行以下操作:
將WAR插件配置為在compile
之前的階段運行,例如generate-resources
,並確保將overlay類文件提取到${project.build.outputDirectory}
。
您還可以使用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.