在Maven中设置外部依赖关系的最佳方法

时间:2012-02-17 18:06:38

标签: java maven jetty

我希望我尽可能准确地解释这一点,并且我想知道我是否正确设置了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仍然需要运行时才能正常工作。我的看法是使用“提供”范围有点繁琐和更多的工作,因为我现在需要记住在修改时更新Nexus中的jar并且我仍然需要更新位于环境变量指向的路径的jar。

有没有办法让我通过maven依赖项将外部jar暴露给Jetty,但是在构建war文件时没有打包到项目中?

你对此有何建议?我应该坚持使用“系统”范围,以便我只需要在一个地方更新jar,或者我应该使用“提供”范围?或者,如果有更好的方法可以做到这一点?

非常感谢。

3 个答案:

答案 0 :(得分:3)

您应该能够将依赖项添加到jetty插件中。然后我就为项目本身提供了范围。

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>

答案 1 :(得分: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>

答案 2 :(得分:0)

我赞成提供。提供的方法 - 下载编译时的依赖项,但我希望在应用程序服务器的类路径上看到它。

我没有意识到您只关心本地开发,因此如果您在外部服务器上运行Jetty,以下内容将非常有用:

Maven将允许您使用Wagon插件将文件部署到服务器。因此,构建过程的一部分可能是将正确的.jar推入Jetty服务器。这样你就不必手动完成。我希望这个解决方案能够按照@Paul的建议在Jetty服务器上运行本地Maven存储库。

如果你想要超级聪明(通常是一个坏主意),你可能会尝试直接在Jetty机器上设置一个存储库,它将直接从你的Jetty安装服务jar。这样你就不必修改Nexus了,罐子只能放在一个地方。您甚至可以将Nexus设置为镜像另一个存储库,这样它就可以自动提取。

修改.jar内容并保持相同的Maven坐标是一种不好的做法。所以这种“聪明”的方法无论如何都不会那么好。