jar – 如何避免与Ivy的拷贝依赖关系

我正在寻找使用常春藤来管理依赖关系,但是哇 – 那个东西真的喜欢制作多个罐子的副本!它像常春藤在我的后院蔓延,也是一样不好!

是否可以让Ivy简单地定义引用解析依赖项的类路径(对于指定的配置文件),以便我们的javac可以直接在ivy仓库(或缓存?)中引用它们.

我已经阅读了参考文档,只能看到设置到存储库缓存的符号链接的选项.我想这是足够的,但这似乎是一种浪费.此外,我不知道“战争”任务可以从符号链接构建战争,但我想我会在尝试的时候找到它.

任何更好的建议?

这是我的标准 Java构建文件,它创建一个可执行的jar.

目的是通过ANT属性和ivy.xml文件的组合来管理项目特定的东西,用于第三方依赖.

<project xmlns:ivy="antlib:org.apache.ivy.ant" name="demo" default="build">

  <property name="src.dir" location="src"/>
  <property name="build.dir" location="build"/>
  <property name="dist.dir" location="dist"/>
  <property name="dist.jar" location="${dist.dir}/${ant.project.name}.jar"/>
  <property name="dist.main.class" value="HelloWorld"/>

  <target name="retrieve">
    <ivy:resolve/>
    <ivy:cachepath pathid="build.path" conf="build"/>
    <ivy:cachepath pathid="runtime.path" conf="runtime"/>
  </target>

  <target name="compile" depends="retrieve">
    <mkdir dir="${build.dir}/classes"/>
    <javac srcdir="${src.dir}" destdir="${build.dir}/classes" classpathref="build.path"/>
  </target>

  <target name="build" depends="compile">
    <ivy:retrieve pattern="${dist.dir}/lib/[artifact].[ext]"/>

    <manifestclasspath property="jar.classpath" jarfile="${dist.jar}">
      <classpath>
        <fileset dir="${dist.dir}/lib" includes="*.jar"/>
      </classpath>
    </manifestclasspath>

    <jar destfile="${dist.jar}" basedir="${build.dir}/classes">
      <manifest>
        <attribute name="Main-Class" value="${dist.main.class}"/>
        <attribute name="Class-Path" value="${jar.classpath}"/>
      </manifest>
    </jar>
  </target>

  <target name="clean">
    <delete dir="${build.dir}"/>
    <delete dir="${dist.dir}"/>
  </target>

</project>

正如你在Ivy文档中发现的,使用cachepath Ivy任务来管理两个ANT路径.一个用于构建依赖关系,另一个用于可执行jar的运行时依赖.

常春藤的实力是配置.我发现很难掌握起初,直到我意识到这是一个简单的逻辑分组的罐子,我可以为我的项目定义.此示例有两种配置:

>建立
>运行时

以下是ivy文件,说明依赖关系如何与配置相关联:

<ivy-module version="2.0">
    <info organisation="com.myspotontheweb" module="demo"/>
    <configurations>
        <conf name="build" description="Libraries needed to for compilation"/>
        <conf name="runtime" extends="build" description="Libraries that need to be included with project jar" />
    </configurations>
    <dependencies>
        <dependency org="commons-lang" name="commons-lang" rev="2.0" conf="build->default"/>
        <dependency org="commons-cli" name="commons-cli" rev="1.0" conf="runtime->default"/>
    </dependencies>
</ivy-module>

总之,我希望这个例子有助于理解Ivy.我喜欢只集中注意力的方式,管理第三方依赖关系.

相关文章

迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图...
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,...
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定...
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个...
命令模式(Command)命令模式(Command)[Action/Transactio...
生成器模式(Builder)生成器模式(Builder)意图:将一个对...