-6ren">
gpt4 book ai didi

java - 有条件地排除 Ivy 的某些依赖关系

转载 作者:行者123 更新时间:2023-12-01 09:00:05 25 4
gpt4 key购买 nike

我的dependency.xml包含我的Web应用程序运行所需的许多包

以下是一些值得注意的片段

<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" extends="test" />
</configurations>


<publications>
<artifact name="${project.name}" type="jar" ext="jar" conf="compile" />
<artifact name="${project.name}" type="zip" ext="zip" conf="compile"/>
</publications>


<dependencies>


<dependency org="org.hibernate" name="hibernate-core" rev="5.1.3.Final" transitive="false" conf="runtime->*"/>
<dependency org="org.hibernate" name="hibernate-ehcache" rev="5.1.3.Final" transitive="false" conf="runtime->*"/>
<dependency org="org.hibernate.common" name="hibernate-commons-annotations" rev="5.0.1.Final" transitive="false" conf="runtime->*"/>
<dependency org="org.hibernate.javax.persistence" name="hibernate-jpa-2.1-api" rev="1.0.0.Final" transitive="false" conf="runtime->*"/>
<dependency org="org.javassist" name="javassist" rev="3.21.0-GA" transitive="false" conf="runtime->*"/>
<dependency org="org.jboss.logging" name="jboss-logging" rev="3.3.0.Final" transitive="false" conf="runtime->*"/>
<dependency org="javax.transaction" name="jta" rev="1.1" transitive="false" conf="runtime->*"/>
<dependency org="net.sf.ehcache" name="ehcache-core" rev="2.6.11" transitive="false" conf="runtime->*"/>
<dependency org="antlr" name="antlr" rev="2.7.7" transitive="false" conf="runtime->*"/>
<dependency org="org.antlr" name="antlr4-runtime" rev="4.5.2-1" transitive="false" conf="runtime->*"/>

</dependencies>

我有来自 javax.transaction 的 JTA 包,应用程序在 Tomcat 下运行需要该包,而应用程序在 WebSphere 下运行则禁止使用该包。

我需要知道如何根据目标平台制作两个不同的 WAR 文件。我不太清楚如何使用配置(如果是这样的话)。

Ant 将为配置运行时执行ivy-retrieve,并使用从 Artifactory 下载的 jar 构建 WAR 存档。

我可以在 Ivy 解决工件后通过删除来手动排除这些 jar,但是嘿,我们是很酷的开发人员,我们喜欢以更干净的方式做事。

您建议我如何做一个针对 Tomcat(包括 JTA)的 ivy-retrieve 以及另一个针对 Websphere(不包括 JTA)的操作?

最佳答案

build.xml:构建 war 文件

以下片段构建了两个 war 文件:

  • ../demo.war
  • ../demo-websphere.war

神奇的是,tomcat retrieve 任务包含两个配置:

<ivy:retrieve pattern="${lib.dir}/tomcat/[artifact].[ext]" conf="runtime,tomcat_only"/>

<war destfile="${dist.dir}/demo.war" webxml="${resources.dir}/web.xml">
<fileset dir="${resources.dir}" excludes="web.xml"/>
<lib dir="${lib.dir}/tomcat"/>
</war>

<ivy:retrieve pattern="${lib.dir}/websphere/[artifact].[ext]" conf="runtime"/>

<war destfile="${dist.dir}/demo-websphere.war" webxml="${resources.dir}/web.xml">
<fileset dir="${resources.dir}" excludes="web.xml"/>
<lib dir="${lib.dir}/websphere"/>
</war>

build.xml:发布

以下答案包含有关将多个模块工件发布到 Maven 存储库的更多详细信息

所以我们需要一个目标来生成POM文件:

<target name="prepare" description="Generate POM">
<!-- Optional: Intermediate file containing resolved version numbers -->
<ivy:deliver deliverpattern="${build.dir}/ivy.xml" pubrevision="${publish.revision}" status="release"/>

<!-- Generate the Maven POM -->
<ivy:makepom ivyfile="${build.dir}/ivy.xml" pomfile="${build.dir}/demo.pom"/>
</target>

还有一个发布构建文件的第二个目标:

<target name="publish" depends="init,prepare" description="Upload to Nexus">
<ivy:publish resolver="nexus-deploy" pubrevision="${publish.revision}" overwrite="true" publishivy="false" >
<artifacts pattern="${build.dir}/[artifact](-[classifier]).[ext]"/>
</ivy:publish>
</target>

仔细注意可选的“classifier”属性,并注意接下来 ivy 文件的结构

ivy.xml

<ivy-module version="2.0" xmlns:e="http://ant.apache.org/ivy/extra">
<info organisation="com.myspotontheweb" module="demo"/>

<configurations>
<conf name="master"/>
<conf name="default" extends="master,runtime"/>
<conf name="compile"/>
<conf name="provided"/>
<conf name="runtime" extends="compile"/>
<conf name="test" extends="runtime"/>
<conf name="tomcat_only" description="A special configuration for special tomcat only dependencies"/>
</configurations>

<publications>
<artifact name="demo" type="war" conf="master"/>
<artifact name="demo" type="pom" conf="master"/>
<artifact name="demo" type="war" conf="master" e:classifier="websphere"/>
</publications>

<dependencies>
<!-- Compile dependencies -->
<dependency org="org.hibernate" name="hibernate-core" rev="5.1.3.Final" conf="compile->default"/>
<dependency org="org.api" name="slf4j-api" rev="1.7.22" conf="compile->default"/>

<!-- Runtime dependencies -->
<dependency org="org.slf4j" name="slf4j-log4j12" rev="1.7.22" conf="runtime->default"/>

<!-- Tomcat dependencies -->
<dependency org="javax.transaction" name="jta" rev="1.1" conf="tomcat_only->master"/>
</dependencies>

</ivy-module>

这里发生的事情很少。

1)让配置映射为您服务

config1->default   # Remote artifact plus transitive dependencies
config2->master # Remote artifact only (Same as setting transitive=false)

2)“extends”属性是一个设置操作,意味着编译依赖项会自动包含为运行时配置。

一个例子是 SLF4J图书馆。编译代码时需要 slf4j-api jar,其中 slf4j-log4j12 jar 包含对 log4j 的绑定(bind)和依赖项,这是一个运行时(且可更改)依赖项。

3)模块中的“master”配置是特殊的,按照 Maven 世界的惯例,对应于该模块发布的文件。

4)“classifier”属性是 extra attribute 的一个示例。在 Ivy 中。

关于java - 有条件地排除 Ivy 的某些依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41747566/

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