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



My dependencies.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将为配置runtime执行ivy-retrieve,并使用从Artifactory下载的jar构建WAR归档。

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

你建议我如何做一个针对Tomcat(包括JTA)的ivy-retrieve,另一个针对Websphere(不包括它)?

build.xml:构建战争文件

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

  • /演示.war
  • /demo-websphere.war

神奇之处在于tomcat检索任务包括两种配置:

<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存储库的更多详细信息

  • 如何使用ivy和nexus发布第三方工件

所以我们需要一个目标来生成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>

仔细注意可选的"分类器"属性,并注意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的绑定和依赖关系,即运行时(和可更改的)依赖关系。

3)模块中的"主"配置是特殊的,按照Maven世界中的惯例,它与该模块发布的文件相对应。

4)"分类器"属性是ivy中一个额外属性的示例。

相关内容

  • 没有找到相关文章

最新更新