1

在这里对 maven 来说很新,所以让我先解释一下我要做什么:

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

所以基本上,我只想在编译时将给定网络目录(其中开发人员无权修改)中的每个 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 文件时都必须修复每个错误升级。
4

3 回答 3

3

我看到三个选项:

  1. 将依赖项放在存储库中(可以是本答案中描述的文件存储库)并使用范围声明它们provided
  2. 使用脏system作用域技巧(即使用系统作用域声明依赖项并设置文件系统中 jar 的路径。
  3. #2 的小变化:创建一个 MANIFEST.MF 引用所有 jar(使用相对路径)的 jar,并声明对这个几乎空的 jar 的依赖关系system

干净的方式是选项#1,但其他方式也适用于您的情况。选项 #3 似乎最接近您正在寻找的内容。

更新:澄清选项#3

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

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

然后在你的 POM 中声明一个依赖c(并且仅在 上csystem,其他 jars 将变得“可见”,而不必在你的 POM 中明确列出它们(当然,你需要在清单中声明它们,但这很容易脚本)。

于 2010-04-20T18:30:51.120 回答
1

尽管您明确表示不希望它们出现在存储库中,但您的理由并不合理。这是我的建议:

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

检查这个类似的问题

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

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

于 2010-04-20T18:25:19.633 回答
1

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

不过,当您使用 maven 时,我不建议您让一些库和 maven 存储库不受控制。我建议在 maven 和 Oracle JDeveloper 库管理之间进行选择。在我们当前的项目中,我们使用 JDeveloper ADF 11g(和 WebCenter)并且我们使用 maven,它只是让我们的库管理更容易。归根结底,我们将拥有大量对 maven 管理有用的第三方库(例如 Apache、Spring 等),而在 IDE 中编译真正需要的 Oracle 库并不多(如您只需要 API 而不需要它们的实现)。我们的方法是在需要时将 Oracle 库添加到我们的 maven 存储库中,并让 maven 控制整个依赖项管理。

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

更新:

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

于 2010-04-24T09:27:58.870 回答