gpt4 book ai didi

java - 创建适当的 ivy 配置(而不是弄乱 *)

转载 作者:行者123 更新时间:2023-12-02 04:43:07 31 4
gpt4 key购买 nike

我有一个项目,其他项目正在使用它作为 Ivy 依赖项。它的 dependencies.xml 包含很多依赖项,基本上分为 3 类:

  • 在 Eclipse 中编译项目并在嵌入式 Tomcat 中运行它以及创建完整的自动一致的 WAR 文件所需的依赖项
  • 编译和运行单元测试所需的依赖项
  • 依赖项通常是 Tomcat 类路径的一部分,包括以下内容,并且需要通过 Ant 编译 Web 项目的 JAR
    • Servlet API
    • JDBC 连接器(它们实际上并未随应用程序一起提供)

第三个依赖类别对我来说很重要。如果我不在 javac 类路径中包含 servlet-api.jar,我将无法编译该项目。但是,如果我将该包包含在 war 类路径中,我就会陷入一种糟糕的做法,因为服务器运行时(主要是 Tomcat,但也包括 Websphere)包含它们自己的 servlet-api.jar

对于 JDBC 连接器,我只需要将它们包含到 Ant 类路径中以从 Bamboo 运行单元测试,因为我想对多个数据库重复相同的测试。

当前代码

这是我当前的 dependency.xml 片段:

<configurations>
<conf name="test" visibility="public" extends="compile" />
<conf name="compile" visibility="public" extends="runtime" />
<conf name="runtime" visibility="public" />
<conf name="provided" visibility="public" />
<conf name="junit" visibility="public" />
</configurations>

    <!-- Build -->
<dependency org="javax.servlet" name="javax.servlet-api" rev="3.0.1" transitive="false" conf="provided->*" />
<dependency org="javax.servlet.jsp" name="javax.servlet.jsp-api" rev="2.3.1" transitive="false" conf="provided->*" />
<dependency org="javax.el" name="javax.el-api" rev="3.0.0" transitive="false" conf="provided->*" />
<dependency org="mysql" name="mysql-connector-java" rev="5.1.38" transitive="false" conf="provided->*" />
<dependency org="ojdbc" name="ojdbc" rev="14" transitive="false" conf="provided->*" />
<dependency org="org.hsqldb" name="hsqldb" rev="2.3.3" transitive="false" conf="provided->*" />
<dependency org="org.postgresql" name="postgresql" rev="9.4.1207" transitive="false" conf="provided->*" />
<dependency org="com.microsoft" name="sqljdbc" rev="4.1" transitive="false" conf="provided->*" />




<dependency org="org.adrianwalker" name="multiline-string" rev="0.1.2" transitive="false" conf="provided->*" />


<!-- Spring -->
<dependency org="org.springframework" name="spring-core" rev="4.2.4.RELEASE" transitive="false" conf="runtime->*"/>
<dependency org="org.springframework" name="spring-aop" rev="4.2.4.RELEASE" transitive="false" conf="runtime->*"/>
<dependency org="org.springframework" name="spring-beans" rev="4.2.4.RELEASE" transitive="false" conf="runtime->*"/>
<dependency org="org.springframework" name="spring-context" rev="4.2.4.RELEASE" transitive="false" conf="runtime->*"/>
<dependency org="org.springframework" name="spring-context-support" rev="4.2.4.RELEASE" transitive="false" conf="runtime->*"/>
<dependency org="org.springframework" name="spring-expression" rev="4.2.4.RELEASE" transitive="false" conf="runtime->*"/>
<dependency org="org.springframework" name="spring-jdbc" rev="4.2.4.RELEASE" transitive="false" conf="runtime->*"/>
<dependency org="org.springframework" name="spring-orm" rev="4.2.4.RELEASE" transitive="false" conf="runtime->*"/>
<dependency org="org.springframework" name="spring-tx" rev="4.2.4.RELEASE" transitive="false" conf="runtime->*"/>
<dependency org="org.springframework" name="spring-web" rev="4.2.4.RELEASE" transitive="false" conf="runtime->*"/>
<dependency org="org.springframework" name="spring-webmvc" rev="4.2.4.RELEASE" transitive="false" conf="runtime->*"/>
<dependency org="org.springframework" name="spring-test" rev="4.2.4.RELEASE" transitive="false" conf="test->*"/>
<dependency org="org.springframework.plugin" name="spring-plugin-core" rev="1.2.0.RELEASE" transitive="false" conf="runtime->*"/>
<dependency org="org.springframework.plugin" name="spring-plugin-metadata" rev="1.2.0.RELEASE" transitive="false" conf="runtime->*"/>

在上面的示例中,com.adrianwalker#multiline-string 仅用于注释解析,不需要其他

Ant

在我的 main-project 中,我最终通过以下任务检索依赖项

<target name="ivy-retrieve">
<ivy:configure override="true" file="${ivy.install.dir}/ivy-settings.xml" />
<ivy:retrieve sync="true" conf="runtime,junit" type="jar,bundle" pattern="${project.local.lib}/[artifact]-[revision].[ext]" />

<eclipse.refreshLocal depth="infinite" resource="/" if:set="eclipse.running" />
</target>

这将使用我需要的所有依赖项(包括 spring-test)正确填充我的 WEB-INF/lib 目录,但没有已手动复制的 JDBC 连接器到 Tomcat 类路径

好的...

问题

当我将 main-project 嵌入到 derived-project 时出现问题

<dependency org="com.example" name="main-project"          rev="${current.version}"         transitive="true"      conf="runtime->*"/>

<target name="ivy-retrieve-eclipse">
<ivy:configure override="true" file="${ivy.install.dir}/ivy-settings.xml" />
<ivy:retrieve sync="true" conf="runtime,junit" type="jar,bundle" pattern="${project.local.lib}/[artifact]-[revision].[ext]" />

<eclipse.refreshLocal depth="infinite" resource="/" if:set="eclipse.running" />
</target>

结果是我仍然下载了所有依赖项。

问题

我只需要告诉 Ivy 为我的 derived-project 下载所有 runtimejunit 的依赖项,包括那些 runtimejunit 依赖项包含在 main-project 的 ivy 文件中。

我该怎么做?我搞砸了什么?

最佳答案

所以我假设您的主要项目将其 jar 发布到存储库中是正确的? (使用发布任务?)。

我认为您的问题是子构建的依赖声明中的配置映射:

<dependency org="com.example" name="main-project"          rev="${current.version}" transitive="true" conf="runtime->*"/>

您声明本地构建的“运行时”配置映射到主项目模块中列出的所有配置。这就是你得到所有 jar 的原因:

conf="runtime->*"

修复很简单:

conf="runtime"

这是以下内容的简写:

conf="runtime->runtime"

关于java - 创建适当的 ivy 配置(而不是弄乱 *),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35769251/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com