2013-01-18 77 views
1

我爲我的開發目的使用maven。我有一個要求,我想包括一些第三方jar在我的項目jar中,並排除在pom.xml文件中指定的其他人。以下是我的pom.xml文件。在製作一個項目jar包含一些jar並排除其他人?

<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/xsd/maven-4.0.0.xsd"> 
<modelVersion>4.0.0</modelVersion> 

<groupId>com.ckdm</groupId> 
<artifactId>Exporter</artifactId> 
<version>atlas2.1</version> 
<packaging>jar</packaging> 

<name>Exporter</name> 
<url>http://maven.apache.org</url> 

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <aspectj.version>1.6.10</aspectj.version> 
    <org.springframework.version>3.0.5.RELEASE</org.springframework.version>   
</properties> 

<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
       <version>2.4</version> 
       <configuration> 
        <descriptorRefs> 
          <descriptorRef>jar-with-dependencies</descriptorRef> 
        </descriptorRefs> 
       </configuration> 
      <executions> 
        <execution> 
          <id>make-assembly</id> 
          <phase>package</phase> 
          <goals> 
           <goal>single</goal> 
         </goals> 
        </execution> 
       </executions> 
     </plugin> 
    </plugins> 
</build> 

<dependencies> 
    <dependency> 
     <groupId>com.ckdm</groupId> 
     <artifactId>CubeCreator</artifactId> 
     <version>atlas2.1</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>com.guavus</groupId> 
     <artifactId>ConcurrentFlows</artifactId> 
     <version>atlas2.1</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>ps</groupId> 
     <artifactId>thriftGenerated</artifactId> 
     <version>atlas2.1</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>apache</groupId> 
     <artifactId>libthrift</artifactId> 
     <version>0.5.0</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.hadoop</groupId> 
     <artifactId>hadoop-core</artifactId> 
     <version>0.20.203.0</version> 
    <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>com.google.code.gson</groupId> 
     <artifactId>gson</artifactId> 
     <version>1.7.1</version> 
    <scope>provided</scope> 
    </dependency> 
<dependency> 
     <groupId>log4j</groupId> 
    <artifactId>log4j</artifactId> 
     <version>1.2.16</version> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-api</artifactId> 
      <version>1.6.4</version> 
    </dependency> 
    <dependency> 
      <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-access</artifactId> 
     <version>1.0.1</version> 
    </dependency> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
      <artifactId>logback-classic</artifactId> 
     <version>1.0.1</version> 
    </dependency> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
      <artifactId>logback-core</artifactId> 
     <version>1.0.1</version> 
</dependency> 

</dependencies> 

</project> 

我讀了一個地方,指定作爲提供的範圍不包括項目jar中的罐子。我錯在哪裏,它不能包括任何罐子?

回答

0

按您的上述評論,我假設你有其中有你的主類是一個罐子。

MANIFEST.MF文件添加到您的項目中。它的內容應該是象下面這樣:

Manifest-Version: 1.0 
Class-path: YourMainJar.jar thirdparty1.jar thirdparty2.jar 
Main-Class: com.test.mymainclass 

YourMainJar.jar是在你有你的主類的文件,第三方罐必須對您的YourMainJar.jar被放置在相同的位置。

當你雙擊你的YourMainJar.jar,它會自動運行,並從同一地點選擇你的第三方罐子。

注意:當您將項目打包爲jar時,需要包含此MANIFEST.MF

+0

這一個工程。只是想知道,有什麼辦法,我可以通過maven做到這一點。就像,在pom.xml中指定一些東西,使它包含我的一些第三方引用的jar和我的項目jar。我做了搜索,可以通過創建項目的組裝jar來包含所有第三方引用的jar。然而,沒有發現任何東西,只包括一些提到的罐子。 。 –

+0

你可能想看看這個答案.... [鏈接](http://stackoverflow.com/questions/1421266/how-to-configure-manifest-only-once-in-pom-xml-in-a -desktop的應用程序) – Garry

0

maven docsprovide

這很像編譯,而是指你所期望的JDK或容器,以提供在運行時的依賴。例如,在爲Java Enterprise Edition構建Web應用程序時,您可以將Servlet API和相關Java EE API的依賴性設置爲範圍,因爲Web容器提供了這些類。此範圍僅在編譯和測試類路徑中可用,且不是傳遞性的。

通過使用範圍provided,它實際上假定容器將在運行時提供依賴關係。但並非所有您添加的依賴實際上都是由容器提供的。

+0

是的,我使用範圍爲我不想在項目jar中使用的庫提供。我沒有使用範圍提供的依賴項,我想包括在我的jar中,而使項目jar。 –

0

刪除範圍標籤。

如果您仍然有問題,請使用我的工作xml。

<!--    Build complete JAR with all dependencies   --> 
     <!-- mvn clean install assembly:single --> 
       <plugin> 
         <groupId>org.apache.maven.plugins</groupId> 
         <artifactId>maven-assembly-plugin</artifactId> 
         <version>2.3</version> 
         <executions> 
          <execution> 
           <id>jar-with-dependencies</id> 
           <phase>install</phase> 
           <goals><goal>single</goal></goals> 
           <configuration> 
            <archive> 
             <manifest> 
              <mainClass>com.mawia.YourMainClass</mainClass> 
             </manifest> 
            </archive> 
            <descriptorRefs> 
             <descriptorRef>jar-with-dependencies</descriptorRef> 
            </descriptorRefs> 
            <finalName>consumer</finalName> 
            <appendAssemblyId>false</appendAssemblyId> 
           </configuration> 
          </execution> 
         </executions> 
       </plugin> 
0

你是什麼意思的第三方jar'項目jar'?如果你有任何你想包含的第三方jar,那麼通過在maven repo或本地添加依賴項來添加它們。

如果你不想在你的項目類路徑中的任何jar文件,然後刪除其依賴項。

對於本地使用:

<dependency> 
     <groupId>org.test</groupId> 
     <artifactId>testjar</artifactId> 
     <version>1.0</version> 
     <scope>system</scope> 
     <systemPath>${project.basedir}/lib/testjar.jar</systemPath> 
    </dependency> 
+0

簡單地添加依賴不會包括那些第三方的罐子到我的罐子裏。所以如果我在其他地方運行我的項目jar,它將無法找到第三方jar中的那些庫。謝謝。 –

+0

maven是用於構建不運行項目的項目。如果您在運行項目時需要jar,請將它們添加到項目的類路徑中。如果你用jar包裝你的項目,然後在清單文件中添加你的jar。 – Garry

+0

我接受你的觀點。我只是說如果你想在你的項目中製作一個捆綁的jar包括一些(而不是全部)被引用的庫,那麼應該怎麼做? –

相關問題