指定maven的类路径

时间:2010-04-20 18:16:56

标签: java oracle maven-2 weblogic oracle-adf

对于maven来说这是一个新手,所以让我先解释一下我要做的事情:

我们有一些不会添加到仓库的JAR文件。这是因为它们特定于Oracle ADF并且已经放置在我们的应用程序服务器上。任何时候只有1个版本可用于所有应用程序。但是为了编译,我们需要在类路径上有这些。有很多这些JARS,所以如果我们要升级到更新版本的ADF,我们必须进入每个应用程序并重新定义一些非常冗余的依赖项。所以,我的目标是将这些JAR添加到类路径中,因为我们将控制在其他地方实际使用的版本。

所以基本上,我想在给定的网络目录(其中devs没有权限修改)中添加每个JAR到maven的类路径,以便在编译时使用。并且不将任何这些JAR文件放入存储库中。当然,这些JAR不能打包到任何EAR / WAR中。

修改

为什么我不想将这些添加到公司回购中的原因之一是:

  1. 这些JAR没有被其他任何东西使用。 Oracle中有很多,不常见且独有的。
  2. 任何时候都只会使用给定JAR的一个版本。永远不会出现应用程序A依赖于1.0而应用程序B依赖于1.1的情况。 App A和B都将仅依赖于1.1或1.2。
  3. 我们计划维持100多个申请。这是很多pom.xml文件,这意味着我们升级Oracle ADF的任何时候,如果没有正确指定任何依赖(通过人为错误),我们将不得不每次编辑那些100多个pom.xml文件时修复每个错误升级。

3 个答案:

答案 0 :(得分:3)

我看到三个选项:

  1. 将依赖项放在存储库中(可以是this answer中所述的文件存储库),并使用范围provided声明它们。
  2. 使用脏system范围技巧(即使用系统范围声明依赖关系并设置文件系统中jar的路径。
  3. #2的小变化:使用MANIFEST.MF创建一个jar,引用所有jar(使用相对路径)并声明对这个几乎为空的jar的依赖关系system范围。
  4. 清洁方式是选项#1,但其他方法也适用于您的情况。选项#3似乎最接近你想要的。

    更新:澄清选项#3

    假设您有一个 a.jar b.jar 的目录。在其c.jar列出其他广告的Class-Path条目中创建 META-INF/MANIFEST.MF ,如下所示:

    Class-Path: ./a.jar ./b.jar 
    

    然后在c(并且只在c)上使用system范围在您的POM中声明依赖关系,其他jar将变为“可见”而无需在您的明确列出它们POM(当然,你需要在清单中声明它们,但这可以很容易编写脚本)。

答案 1 :(得分:1)

虽然您明确声明您不希望它们存储在存储库中,但您的理由并不合理。这是我的建议:

  • 在您的存储库中安装这些罐子
  • 使用<scope>provided</scope>将它们添加为maven依赖项。这意味着它们由您的运行时(应用程序服务器)提供,并且不会包含在您的工件中(war / ear)

检查this similar question

建议广泛使用maven的组织拥有自己的存储库。你可以看到Nexus。然后,您可以在存储库中安装这些jar,所有开发人员都将使用它们,而不是仅在每个本地存储库中安装jar。

(“ugliest”选项根本不是使用maven,把jar放在相对位置并将它们添加到项目的类路径中,提交classpath属性文件(取决于IDE))

答案 2 :(得分:1)

如果您正在开发ADF(我估计10g / 11g)组件,我想您将使用JDeveloper作为IDE。 JDeveloper附带了一个非常丰富的库管理工具,允许您定义编译所需的库或应该打包哪些库以进行部署。我想你已经知道如何向项目中添加库,并在部署配置文件中指出在打包时应该选择哪些库。如果你想让你的库远离maven,也许这可能是最好的方法。假设您所引用的库也是“Webcenter”库,使用这种方法可以保证您拥有足够的库,因为JDeveloper将附带正确的版本库。

然而,当您使用maven时,我不建议保留一些库失控和maven存储库。我建议在maven和Oracle JDeveloper库管理之间进行选择。在我们当前的项目中,我们正在使用JDeveloper ADF 11g(和WebCenter),我们使用maven,它只是简化了库管理。在一天结束时,我们将拥有大量第三方库(比如Apache,Spring等),这些库对于maven进行管理很有用,并且在IDE中编译实际上不需要太多的Oracle库(就像你一样)只需要API而不是他们的实现)。我们的方法是在需要时将Oracle库添加到我们的maven存储库,让maven控制整个依赖关系管理。

正如其他人在答案中所说,如果您不希望将依赖项包含在任何工件中,请使用<scope>provided</scope>。一旦配置了开发环境,您就会感激maven完成工作,您可以(几乎)忘记依赖管理。要构建JDeveloper IDE文件,我们使用maven jdev插件,因此mvn jdev:jdev将构建生成我们的项目文件并设置库的依赖关系,并在其中进行正确编译。

更新:

当然,您需要在pom文件中引用ADF库。在我们的项目中,我们只是参考每个应用程序使用的那些,比如说ADF标签库或特定服务,而不是整个ADF / WebCenter堆栈。为此目的,使用“提供”范围。您仍然可以让JDeveloper管理您的库,但我们发现使用100%JDeveloper库方法或100%maven方法更简单。如果你采用maven方法,首先需要花一些时间来构建你的本地仓库,但是一旦完成它就很容易维护,整个周期(开发,构建,测试,打包和部署)将更简单,具有更一致的配置。确实,在未来您将不得不更新到以后的ADF版本,但是由于您的存储库结构已经定义,因此它应该是快速的。对于将来的升级,我建议将ADF版本保留为顶部pom上的属性,这样可以更快地切换到新版本。