有条不紊地排除与常春藤的某些依赖关系

时间:2017-01-19 17:01:51

标签: java ant dependency-management ivy

我的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-retrieve执行runtime,并使用从Artifactory下载的jar来构建WAR存档。

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

你怎么建议我做一个针对Tomcat的ivy-retrieve,包括针对除了它的Websphere的另一个针对JTA?

1 个答案:

答案 0 :(得分:1)

build.xml:构建战争文件

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

  • ../ demo.war
  • ../演示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存储库的更多详细信息

所以我们需要一个目标来生成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.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”属性是一个set操作,这意味着编译依赖项自动包含在运行时配置中。

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

3) 模块中的“主”配置是特殊的,按照惯例,Maven world对应于此模块发布的文件。

4) “分类器”属性是常春藤中extra attribute的一个示例。