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>