2011-07-14 48 views
2

我有兩個基於Maven的eclipse項目,一個是使用公共類的項目,另一個是使用這些項目的Java EE Web應用程序。將maven和eclipse封裝到WAR中的公共類

現在,我知道如何將通用項目構建爲jar,並將其作爲依賴添加到其他項目中。

但是,如果我想讓公共類直接包含在WAR的WEB-INF/classes中,我將如何解決它?

而且,這個機制是否可以在eclipse和命令行中運行maven命令?

+0

如果您發現任何有用的答案,或者如果他們證明你問什麼不能做,一定要接受和回答並投票:-) –

回答

0

正確的方法是有兩個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> 
+0

感謝您復活舊的問題,它仍然可以使用。但是我的問題中有一個細節可能忽略了:我的目的不是在WEB-INF/lib中添加jar文件,而是直接在WEB-INF/classes下的公共項目中添加編譯後的類,就好像它們是part第二個項目的源代碼樹。原因在於,common.jar中的公共持久性配置無法識別。 –

+0

如果這是一個JEE項目,你的持久化類應該進入一個EJB中,而不是在WEB-INF/classes中,它們將被自動識別。我會*建議堅持最佳實踐並遵循這種模式。 如果你真的想要解開一個jar包,並且願意接受將來會面臨的衆多問題,你可以使用maven dependency插件來實現這一點。 –

+0

你對最佳實踐是對的,我的意圖不是違反它們。也許我做了其他錯誤。我有我的標準實體POJO,並將它們放到common.jar中。我也把persistence.xml放進去了。但是當在戰爭中使用這個罐子時,容器無法使用這些實體並抱怨它。這就是爲什麼我試圖將這些課程直接投入戰爭的原因。所以,如果你能指點我這樣一個示範項目,我會非常感激。 –

0

您可以使用Maven dependency plugin將包含常用類的.jar工件解壓縮到目標文件夾。您還需要使原始依賴項具有provided範圍,因此這些類不會包含在您的結果戰爭中的文件夾中的classes文件夾和(作爲.jar)。

+0

感謝您的提示。但是因爲我對maven完全陌生,所以我不確定,如何正確使用它。我調整了你指出的例子,但它並沒有將它打包到日食中的部署戰爭中。此外,它抱怨說不支持在m2e中解包。 –