我希望我儘可能準確地解釋此問題,並且我想知道是否正確設置了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,或者我應該使用「提供的」範圍?或者如果還有更好的方法來做到這一點?
非常感謝。
使用提供的範圍和'$ {env.EXTERNAL_JAR}'對我來說似乎完全合適。如果您想在本地存儲庫中尋址jar,則可以使用'$ {settings.localRepository}/com/test/app/app-jar/1.0/app-jar-1.0.jar'來代替。 – 2012-02-17 18:56:01
@保羅,我更喜歡你的方法。您的方式允許我使用提供的範圍,而無需設置指向外部jar的任何環境變量。我不知道「$ {settings.localRepository}」是否存在。如果您可以在下面發佈您的副本並粘貼您的回覆,我會加倍努力,或許,如果沒有其他更好的回覆,請接受您的解決方案。謝謝。 – limc 2012-02-17 19:44:22