Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建适当的常春藤配置(并且不干扰*)_Java_Ivy - Fatal编程技术网

Java 创建适当的常春藤配置(并且不干扰*)

Java 创建适当的常春藤配置(并且不干扰*),java,ivy,Java,Ivy,我有一个项目,它被其他项目用作常春藤的附属项目。它的依赖项.xml包含很多依赖项,基本上分为3类: 依赖项需要在Eclipse中编译项目并在嵌入式Tomcat中运行,以及创建一个完整的自动一致的WAR文件 编译和运行单元测试所需的依赖项 依赖项通常是Tomcat类路径的一部分,包括下面的,并且需要通过Ant编译web项目的JAR Servlet API JDBC连接器(实际上它们不是随应用程序一起提供的) 第三类依赖对我来说至关重要。如果我没有在javac类路径中包含servlet ap

我有一个项目,它被其他项目用作常春藤的附属项目。它的
依赖项.xml
包含很多依赖项,基本上分为3类:

  • 依赖项需要在Eclipse中编译项目并在嵌入式Tomcat中运行,以及创建一个完整的自动一致的WAR文件
  • 编译和运行单元测试所需的依赖项
  • 依赖项通常是Tomcat类路径的一部分,包括下面的,并且需要通过Ant编译web项目的JAR
    • Servlet API
    • JDBC连接器(实际上它们不是随应用程序一起提供的)
第三类依赖对我来说至关重要。如果我没有在
javac
类路径中包含
servlet api.jar
,我就无法编译该项目。但是,如果我在war类路径中包含该包,我就会陷入一种糟糕的做法,因为服务器运行时(主要是Tomcat,但也包括Websphere)包含它们自己的
servlet api.jar

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

现行代码 以下是我当前的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>
这将使用我需要的所有依赖项(包括
spring test
)正确地填充我的
WEB-INF/lib
目录,但没有已经手动复制到Tomcat类路径的JDBC连接器

好的

问题 当我将
主项目
嵌入
派生项目

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


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

问题 我只需要告诉Ivy下载我的
派生项目
运行时
junit
的所有依赖项,包括
主项目
的Ivy文件中包含的
运行时
junit
依赖项


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

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

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

<dependency org="com.example" name="main-project"          rev="${current.version}" transitive="true" conf="runtime->*"/>
解决办法很简单:

conf="runtime"
这是以下的简写:

conf="runtime->runtime"

在以前的设置中有两个问题:

  • 正如@MarkOConnor所强调的,我在子项目依赖项上使用了
    conf=“runtime->*”
    ,它只会将
    runtime
    重新映射到
    所有配置
  • 父工件和子工件的配置不一致
  • 关于第2点,我有以下关于父项目的信息

    <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>
    
    
    
    下面是儿童项目

    <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" extends="compile" />
        <conf name="junit" visibility="public" extends="provided, test" />
    </configurations>
    
    
    
    所以我必须首先将子项目与父项目对齐

    第二步,尽管可能是可以避免的,但是为每个需要的配置多次重新映射父项目的依赖关系。也许我可以在此基础上进行优化,但至少我没有将jdbc JAR下载到运行时类路径中

    因此,对儿童的依赖变得越来越严重

    <dependencies>  
        <dependency org="com.acme"              name="parent-project"          rev="${phoenix.version}"         transitive="true"      conf="runtime->runtime"/>
        <dependency org="com.acme"              name="parent-project"          rev="${phoenix.version}"         transitive="true"      conf="compile->compile"/>
        <dependency org="com.acme"              name="parent-project"          rev="${phoenix.version}"         transitive="true"      conf="provided->provided"/>
        <dependency org="com.acme"              name="parent-project"          rev="${phoenix.version}"         transitive="true"      conf="junit->junit"/>
        <dependency org="com.acme"              name="parent-project"          rev="${phoenix.version}"         transitive="true"      conf="test->test"/>
    </dependencies>
    
    
    
    父项目如何?如果我将所有的
    ->*
    替换为空(例如
    conf=“test->*”
    对于像
    ojdbc
    这样的依赖项变成
    conf=“test”
    ),那么我无法检索依赖项。Ivy说配置
    测试
    不正确public@usr-局部-ΕψΗΕ∧ΝΝ在您的示例中,“测试”配置具有公共可见性,这不是父配置吗?在我找到解决方案后,现在自动回答您的最后一个块可以简化为一行,这意味着相同的事情,可以说`````
    
    conf="runtime->runtime"
    
    <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>
    
    <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" extends="compile" />
        <conf name="junit" visibility="public" extends="provided, test" />
    </configurations>
    
    <dependencies>  
        <dependency org="com.acme"              name="parent-project"          rev="${phoenix.version}"         transitive="true"      conf="runtime->runtime"/>
        <dependency org="com.acme"              name="parent-project"          rev="${phoenix.version}"         transitive="true"      conf="compile->compile"/>
        <dependency org="com.acme"              name="parent-project"          rev="${phoenix.version}"         transitive="true"      conf="provided->provided"/>
        <dependency org="com.acme"              name="parent-project"          rev="${phoenix.version}"         transitive="true"      conf="junit->junit"/>
        <dependency org="com.acme"              name="parent-project"          rev="${phoenix.version}"         transitive="true"      conf="test->test"/>
    </dependencies>