我有兩個基於Maven的eclipse項目,一個是使用公共類的項目,另一個是使用這些項目的Java EE Web應用程序。將maven和eclipse封裝到WAR中的公共類
現在,我知道如何將通用項目構建爲jar,並將其作爲依賴添加到其他項目中。
但是,如果我想讓公共類直接包含在WAR的WEB-INF/classes中,我將如何解決它?
而且,這個機制是否可以在eclipse和命令行中運行maven命令?
我有兩個基於Maven的eclipse項目,一個是使用公共類的項目,另一個是使用這些項目的Java EE Web應用程序。將maven和eclipse封裝到WAR中的公共類
現在,我知道如何將通用項目構建爲jar,並將其作爲依賴添加到其他項目中。
但是,如果我想讓公共類直接包含在WAR的WEB-INF/classes中,我將如何解決它?
而且,這個機制是否可以在eclipse和命令行中運行maven命令?
正確的方法是有兩個Maven項目。通過將庫上的包裝聲明爲「jar」,並將webapp聲明爲「war」maven將使用正確的插件來構建您的應用程序,如上所述。您的場景相當普遍,除了我要提供的信息外,Maven文檔中還提供了大量有關此信息的信息。
你的JAR庫應該類似於這樣的POM建:
<?xml version="1.0" encoding="UTF-8"?>
<project
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.myproject.mypackage</groupId>
<artifactId>my-lib</artifactId>
<version>1.0.0-SNAPSHOT</version>
<name>${project.artifactId}</name>
<packaging>jar</packaging>
你的web應用程序應該用POM similiar建成以這樣的:
<?xml version="1.0" encoding="UTF-8"?>
<project
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.myproject.mypackage</groupId>
<artifactId>my-war</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>${project.artifactId}</name>
<dependencies>
<dependency>
<groupId>com.myproject.mypackage</groupId>
<artifactId>my-lib</artifactId>
<version>1.0.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
當你構建Web應用程序時,Maven會自動將您的庫Jar包含在您的web-inf/lib目錄中。永遠不要在這個目錄中手動放置文件,讓Maven爲你付出沉重的代價。
編輯:問題是如何在構建過程中解壓一個jar,這是一個非常糟糕的主意,因爲衆多原因和不好的做法。持久化類屬於EJB,而不屬於WEB-INF/classes。這樣做也會把你外面標準的Java EE支持......然而,這裏的答案:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<id>unpack</id>
<phase>package</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>com.myproject.mypackage</groupId>
<artifactId>my-lib</artifactId>
<version>1.0.0-SNAPSHOT</version>
<overWrite>true</overWrite>
<outputDirectory>WEB-INF/classes</outputDirectory>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
感謝您復活舊的問題,它仍然可以使用。但是我的問題中有一個細節可能忽略了:我的目的不是在WEB-INF/lib中添加jar文件,而是直接在WEB-INF/classes下的公共項目中添加編譯後的類,就好像它們是part第二個項目的源代碼樹。原因在於,common.jar中的公共持久性配置無法識別。 –
如果這是一個JEE項目,你的持久化類應該進入一個EJB中,而不是在WEB-INF/classes中,它們將被自動識別。我會*建議堅持最佳實踐並遵循這種模式。 如果你真的想要解開一個jar包,並且願意接受將來會面臨的衆多問題,你可以使用maven dependency插件來實現這一點。 –
你對最佳實踐是對的,我的意圖不是違反它們。也許我做了其他錯誤。我有我的標準實體POJO,並將它們放到common.jar中。我也把persistence.xml放進去了。但是當在戰爭中使用這個罐子時,容器無法使用這些實體並抱怨它。這就是爲什麼我試圖將這些課程直接投入戰爭的原因。所以,如果你能指點我這樣一個示範項目,我會非常感激。 –
您可以使用Maven dependency plugin將包含常用類的.jar工件解壓縮到目標文件夾。您還需要使原始依賴項具有provided
範圍,因此這些類不會包含在您的結果戰爭中的文件夾中的classes
文件夾和(作爲.jar)。
感謝您的提示。但是因爲我對maven完全陌生,所以我不確定,如何正確使用它。我調整了你指出的例子,但它並沒有將它打包到日食中的部署戰爭中。此外,它抱怨說不支持在m2e中解包。 –
如果您發現任何有用的答案,或者如果他們證明你問什麼不能做,一定要接受和回答並投票:-) –