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

标签 java ivy

我有一个项目,其他项目正在使用它作为 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/

相关文章:

spring - Tomcat 的 javax.servlet 与 Apache Ivy 问题的解决依赖关系

java - Hibernate @Check 以确保在列中仅出现一次特定值

java - 如何在Struts2或Hibernate中调用MySQL View

java - 模式匹配 Java 正则表达式 - "One-or-more"运算符

java - 如何将reducer的输出写入数据库?

ivy - 带有 ivy 的最新稳定版本,不包括 alpha 和 beta 版本

java - 暂停和恢复计时器而不重置计时器

ivy - 防止 Ivy 包含测试依赖项

spring-mvc - ivy - spring-web 有 Unresolved 依赖关系

Ivy 无法解决