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将为配置 我可以在Ivy解决工件后通过删除来手动排除这些jar,但嘿,我们是很酷的开发人员,我们喜欢以更干净的方式做事情。 你建议我如何做一个针对Tomcat(包括JTA)的runtime
执行ivy-retrieve
,并使用从Artifactory下载的jar构建WAR归档。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中一个额外属性的示例。