2011-04-08 42 views
14

我想通過本地文件系統相對於我的項目目錄結構而不是遠程存儲庫通過systemPath添加jar文件。我添加了依賴聲明,但maven並沒有做任何其他的事情。Maven通過systemPath/system添加jar,但未添加到war或其他任何地方

在下面的聲明中,我想將jar文件複製到我的目標web-inf/lib目錄中,並將其作爲war文件的一部分進行震動。目前,這並未發生。我如何將jar文件複製到我的war文件中?

這是從調試模式行家輸出:

DEBUG] cglib:cglib-nodep:jar:2.2:test (setting scope to: compile)^M 
DEBUG] Retrieving parent-POM: org.objenesis:objenesis-parent:pom:1.2 for project: null:objenesis:ja 
DEBUG] org.objenesis:objenesis:jar:1.2:test (selected for test)^M 
DEBUG] org.javap.web:testRunWrapper:jar:1.0.0:system (selected for system)^M 
DEBUG] Plugin dependencies for: 
... 


<dependency> 
    <groupId>org.javap.web</groupId> 
    <artifactId>testRunWrapper</artifactId> 
    <version>1.0</version> 
    <scope>system</scope> 
    <systemPath>${basedir}/lib/testRunWrapper.jar</systemPath> 
</dependency> 
<plugin> 
    <artifactId>maven-war-plugin</artifactId> 
    <configuration>     
     <webResources> 
      <resource> 
       <directory>WebContent</directory> 
      </resource> 
     </webResources> 
    </configuration> 
</plugin> 

回答

21

好的,我這樣做:請注意底部的目錄結構。 使用下面的方法,來自相關項目路徑的jar文件被視爲像其他jar一樣的頭等公民。下面的清單糾正了我原來的問題。通過下面的pom.xml清單,jar文件被複制到我的目標目錄中。

<repositories> 
    <repository> 
     <id>JBoss</id> 
     <name>JBoss Repository</name> 
     <layout>default</layout> 
     <url>http://repository.jboss.org/maven2</url> 
    </repository> 

    <repository> 
     <id>my-local-repo</id> 
     <url>file://${basedir}/lib/repo</url> 
    </repository> 
</repositories> 

<dependency> 
    <groupId>testRunWrapper</groupId> 
    <artifactId>testRunWrapper</artifactId> 
    <version>1.0.0</version>    
</dependency> 

$ find repo 
repo 
repo/testRunWrapper 
repo/testRunWrapper/testRunWrapper 
repo/testRunWrapper/testRunWrapper/1.0.0 
repo/testRunWrapper/testRunWrapper/1.0.0/testRunWrapper-1.0.0.jar 
+1

這是什麼問題? ?注意,你通常使用'mvn install:install-file'來安裝一個依賴項,並且你的默認本地倉庫位於'home/.m2/repository'。 – Thomas 2011-04-08 15:30:04

+0

不起作用... – nnhthuan 2012-07-18 10:01:27

+0

這是去捆綁ojdbc6驅動程序記得在應用到Windows設備時將本地系統路徑分隔符更改爲反斜槓 – 2012-07-25 14:58:59

1

AFAIK,系統範圍的依賴性是有點像那些與設置範圍,因此不包括在目標工件。爲什麼不將依賴項安裝到本地存儲庫中呢?

從DOC:

系統
此範圍類似,但你必須提供包含它明確的JAR提供。工件始終可用,並且不會在存儲庫中查找。

+0

我想我可以,但不知道這是否是要走的路。 – 2011-04-08 15:23:33

+2

「只需」將jar安裝在本地存儲庫中。每次有新員工時,團隊中的所有人。這是傳統和第三方罐子的典型maven解決方案,但它很糟糕。將這些難以獲取的罐子放在源代碼控制中,然後建立「正常工作」的構建過程會容易得多,即使項目源中的罐子在maven-land中是褻瀆的。至少,我寧願將nexus服務器作爲maven中央和本地構建工件的緩存,而不是作爲稀少的自定義存檔:-( – Roboprog 2015-06-17 23:53:10

+0

或者對這些項目具有單獨的repo _within_ Nexus/Artifactory,稱爲「存檔或者類似的,所以不會有任何混淆,那麼你就不必向你的Maven人解釋你爲什麼一天褻瀆9次...... – SusanW 2017-04-26 11:48:59

5

不要使用系統。要做你想做的事情,只需聲明一個常規(編譯)依賴項,然後使用mvn install:install-file到你的本地倉庫。其他一切都會按照你的意願工作(lib將被複制等)。這意味着構建只能在你的機器上運行。

要正確地爲您的(內部)團隊解決此問題,您需要設置存儲庫(例如Artifactory,Nexus或Archiva)。這對團隊使用Maven來說幾乎是必須的。

如果這是公開的(例如開源)使用,您可以通過http服務器模仿存儲庫或建立一個真實的存儲庫。

+0

作爲除此之外,CloudBees.com甚至可以提供一個不錯的Maven倉庫功能eir最便宜的賬戶選項。 – 2013-03-29 20:30:02

1

嘗試這樣的事情(使用Ant插件手動將罐子輸出目錄):

<plugin> 
     <artifactId>maven-antrun-plugin</artifactId> 
     <executions> 
     <execution> 
      <phase>test</phase> 
      <goals> 
      <goal>run</goal> 
      </goals> 
      <configuration> 
      <tasks> 
       <copy file="${project.basedir}/pathToJAR.jar" 
        todir="${project.build.directory}/outputFileName/WEB-INF/lib"/> 
      </tasks> 
      </configuration> 
     </execution> 
     </executions> 
    </plugin> 
0

採用基準文件系統的問題是,相關項目將無法全局訪問這個jar文件。即依賴項目的$ {basedir}是不同的,因此.jar文件將不會被找到。

另一方面,全球存儲庫是普遍可訪問的。

14

使用Maven的依賴插件做這項工作:

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <version>2.8</version> 
      <executions> 
       <execution> 
        <id>copy-dependencies</id> 
        <phase>compile</phase> 
        <goals> 
         <goal>copy-dependencies</goal> 
        </goals> 
        <configuration> 
         <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/lib</outputDirectory> 
         <includeScope>system</includeScope> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 
+0

僅供參考:當我這樣做時,日誌消息表明在* .war由鬆散文件創建後,該jar被複制到.../WEB-INF/lib/*中。這隻會讓瓶子進入戰爭,如果你運行它兩次而不乾淨。 – Roboprog 2015-06-18 00:07:25

+1

我在你的設置中更改了一個單詞:「包」 - >「編譯」執行階段。現在它是第一次/在「清潔」之後。謝謝!!! – Roboprog 2015-06-18 00:13:45

0

如果this answer沒有爲你工作,因爲它沒有爲我和你知道system是一個糟糕的範圍,你可以試試這個解決方案,你在哪裏(向下滾動一下),它將JAR安裝到實際的本地Maven倉庫中。基本上你只需要這個插件添加到您的pom.xml:在適當的值

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-install-plugin</artifactId> 
    <version>2.4</version> 
    <executions> 
    <execution> 
     <phase>initialize</phase> 
     <goals> 
     <goal>install-file</goal> 
     </goals> 
     <configuration> 
     <groupId>myGroupId</groupId> 
     <artifactId>myArtifactId</artifactId> 
     <version>myVersion</version> 
     <packaging>jar</packaging> 
     <file>${basedir}/lib/xxx.jar</file> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

填補groupIdartifactIdversion,並把原來的jar文件到<project-home>/lib -directory及以上的固定file。您可以添加更多execution -sections,但這時別忘了添加id在那兒,像:

 <execution> 
     <id>common-lib</id> 

大家誰從更新的代碼回購需要調用mvn initialize一次。

和所有Eclipse的愛好者可能會增加這pom.xml,也擺脫錯誤在Eclipse:

<pluginManagement> 
    <plugins> 
    <!-- This plugin's configuration is used to store Eclipse m2e settings 
     only. It has no influence on the Maven build itself. --> 
    <plugin> 
     <groupId>org.eclipse.m2e</groupId> 
     <artifactId>lifecycle-mapping</artifactId> 
     <version>1.0.0</version> 
     <configuration> 
     <lifecycleMappingMetadata> 
      <pluginExecutions> 
      <pluginExecution> 
       <pluginExecutionFilter> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-install-plugin</artifactId> 
       <versionRange>[2.4,)</versionRange> 
       <goals> 
        <goal>install-file</goal> 
       </goals> 
       </pluginExecutionFilter> 
       <action> 
       <execute></execute> 
       </action> 
      </pluginExecution> 
      </pluginExecutions> 
     </lifecycleMappingMetadata> 
     </configuration> 
    </plugin> 
    </plugins> 
</pluginManagement> 
相關問題