2012-02-17 67 views
2

我希望我儘可能準確地解釋此問題,並且我想知道是否正確設置了Maven依賴關係,或者如果有更好的方法來執行此操作。在Maven中設置外部依賴關係的最佳方法

我的大部分開發團隊的項目都依賴於部署在服務器類加載器中的本地jar。這個jar的原因在於這個級別的原因是爲了便於在一個地方更新jar而不重新包裝每個正在使用它的項目,假設對它進行的更改是向後兼容的。

我在本地開發中針對Jetty開發我的web應用程序。因此,爲了使Web應用程序在本地工作,我設置的依賴關係是這樣的: -

<dependencies> 
    <!-- Configuring external jar dependency --> 
    <dependency> 
     <groupId>com.test.app</groupId> 
     <artifactId>app-jar</artifactId> 
     <version>1.0</version> 
     <scope>system</scope> 
     <systemPath>${env.EXTERNAL_JAR}</systemPath> 
    </dependency> 

    ... 
</dependencies> 

<build> 
    <plugins> 
     <!-- Configuring Jetty --> 
     <plugin> 
      <groupId>org.mortbay.jetty</groupId> 
      <artifactId>maven-jetty-plugin</artifactId> 
      <version>6.1.26</version> 
      <configuration> 
       <contextPath>/${project.parent.artifactId}</contextPath> 
       <jettyEnvXml>${env.JETTY_ENV_XML}</jettyEnvXml> 
       <scanIntervalSeconds>1</scanIntervalSeconds> 
       <connectors> 
        <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector"> 
         <port>7777</port> 
        </connector> 
       </connectors> 
       <webAppConfig> 
        <extraClasspath>${env.EXTERNAL_JAR}</extraClasspath> 
       </webAppConfig> 
      </configuration> 
     </plugin> 

     ... 
    </plugins> 
</build> 

在這種方法中,我成立了一個指向外部JAR路徑的環境變量,並引用它我的pom.xml爲${env.EXTERNAL_JAR}

在做了一些閱讀之後,似乎使用「系統」範圍被認爲是不好的做法。所以,我在安裝此的Nexus外部JAR和變更範圍的「規定」: -

<dependency> 
    <groupId>com.test.app</groupId> 
    <artifactId>app-jar</artifactId> 
    <version>1.0</version> 
    <scope>provided</scope> 
</dependency> 

這讓我正確編譯我的項目,但我不知道,如果它甚至可以讓我得到徹底清除「EXTERNAL_JAR」環境變量,因爲Jetty仍然需要Jetty爲運行時正常工作。我認爲使用「提供」範圍是一個單調乏味的工作,因爲我現在需要記住在修改Nexus時更新jar,而且我仍然需要更新位於環境變量指向的路徑上的jar。

有沒有辦法讓我通過maven依賴項將外部jar暴露給Jetty,但是在war文件構建時沒有打包到項目中?

你對此有何建議?我應該堅持「系統」範圍,以便我只需要在一個地方更新jar,或者我應該使用「提供的」範圍?或者如果還有更好的方法來做到這一點?

非常感謝。

+0

使用提供的範圍和'$ {env.EXTERNAL_JAR}'對我來說似乎完全合適。如果您想在本地存儲庫中尋址jar,則可以使用'$ {settings.localRepository}/com/test/app/app-jar/1.0/app-jar-1.0.jar'來代替。 – 2012-02-17 18:56:01

+0

@保羅,我更喜歡你的方法。您的方式允許我使用提供的範圍,而無需設置指向外部jar的任何環境變量。我不知道「$ {settings.localRepository}」是否存在。如果您可以在下面發佈您的副本並粘貼您的回覆,我會加倍努力,或許,如果沒有其他更好的回覆,請接受您的解決方案。謝謝。 – limc 2012-02-17 19:44:22

回答

3

你應該能夠依賴添加到碼頭插件。然後我爲項目本身提供了範圍。

http://docs.codehaus.org/display/JETTY/Maven+Jetty+Plugin

<project> 
... 
     <plugin> 
     <groupId>org.mortbay.jetty</groupId> 
     <artifactId>maven-jetty-plugin</artifactId> 
     <configuration> 
      <systemProperties> 
      <systemProperty> 
       <name>logback.configurationFile</name> 
       <value>./src/etc/logback.xml</value> 
      </systemProperty> 
      </systemProperties> 
     </configuration> 
     <dependencies> 
      <dependency> 
      <groupId>ch.qos.logback</groupId> 
      <artifactId>logback-classic</artifactId> 
      <version>0.9.15</version> 
      </dependency> 
     </dependencies> 
     </plugin> 
... 
<project> 
+0

謝謝!這是我正在尋找的。 – limc 2012-02-20 15:29:35

1

要做的最好的事情是設置一個外部存儲庫與您的依賴關係,並將其添加到您的POM。

<repositories> 
    <repository> 
     <id>my-repo</id> 
     <name>my-repo</name> 
     <url>http://your.repo.url</url> 
    </repository> 
</repositories> 

,然後你可以添加你的依賴作爲

<dependency> 
    <groupId>com.test.app</groupId> 
    <artifactId>app-jar</artifactId> 
    <version>1.0</version> 
</dependency> 
+0

這種方法的問題是當我生成戰爭文件時,這個jar會被打包到項目中,這正是我想要阻止的地方......否則,我會在項目中結束一個jar,並且服務器類加載器上的另一個jar。 – limc 2012-02-17 18:53:19

0

我同意提供。提供的手段 - 下載編譯時的依賴關係,但我希望在應用程序服務器的類路徑中看到它。

我不知道你只關心你的地方發展,因此,如果你是一個外部服務器上運行的Jetty以下將是有益的:

Maven將讓你部署一個文件使用旅行車插件服務器。因此,構建過程的一部分可能會將正確的.jar推送到您的Jetty服務器。這樣你就不必手動進行。我更喜歡這個解決方案按照@Paul的建議在Jetty服務器上運行本地Maven倉庫。

如果你想超級聰明(通常是一個壞主意),你可以嘗試直接在Jetty機器上建立一個倉庫,它可以直接從你的Jetty安裝中提供jar。這樣你就不必修改Nexus,罐子只會在一個地方。您甚至可以設置Nexus來鏡像另一個存儲庫,以便它可以自動選擇。

修改.jar內容並保持相同的Maven座標是一種不好的做法。所以這個「聰明」的方法無論如何不會奏效。