Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jar 如何避免使用Ivy复制依赖项_Jar_Dependencies_Ivy - Fatal编程技术网

Jar 如何避免使用Ivy复制依赖项

Jar 如何避免使用Ivy复制依赖项,jar,dependencies,ivy,Jar,Dependencies,Ivy,我正在考虑使用常春藤来管理依赖关系,但是哇,这东西真的很喜欢制作多个JAR副本!它像我后院的常春藤一样蔓延,同样不受欢迎 有没有可能让Ivy简单地定义一个类路径(对于指定的概要文件)来引用已解析的依赖项,这样我的javac就可以直接在Ivy存储库(或缓存)中引用它们 我已经阅读了参考文档buy only,看到了设置到存储库缓存的符号链接的选项。我想这就足够了,但这似乎是浪费。此外,我不确定“战争”任务是否可以从符号链接构建战争。。。但我想我试一下就会发现 还有更好的建议吗 在阅读了写得很糟糕的常

我正在考虑使用常春藤来管理依赖关系,但是哇,这东西真的很喜欢制作多个JAR副本!它像我后院的常春藤一样蔓延,同样不受欢迎

有没有可能让Ivy简单地定义一个类路径(对于指定的概要文件)来引用已解析的依赖项,这样我的javac就可以直接在Ivy存储库(或缓存)中引用它们

我已经阅读了参考文档buy only,看到了设置到存储库缓存的符号链接的选项。我想这就足够了,但这似乎是浪费。此外,我不确定“战争”任务是否可以从符号链接构建战争。。。但我想我试一下就会发现


还有更好的建议吗

在阅读了写得很糟糕的常春藤文献后(叹气-这些人怎么了?-他们没有参加任何语言的高中识字课吗?),我看到有一个名为cachepath的后期解析任务,它将构造一个到已解析依赖项工件的ant路径,而不是将文件复制到lib目录。这可能正是我要找的

这是我的标准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>

总之,我希望这个例子有助于理解常春藤。我喜欢它只专注于一件事的方式,即第三方依赖关系的管理。

只是为了补充@Mark的答案

<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>
请注意,
cachepath
result也可以直接在构建中使用,而无需使用
retrieve
复制jar:

<target name="build" depends="compile">
    <jar destfile="${dist.ear}">
        <mappedresources>
            <resources refid="runtime.path"/>
            <chainedmapper>
                <flattenmapper/>
                <globmapper from="*" to="lib/*"/>
            </chainedmapper>
        </mappedresources>
    </jar>
</target>


我放弃!常春藤的文档太糟糕了,以至于整个框架都毫无用处。我将不得不编写自己的依赖关系管理构建配置。作为解决方案并为ivy创建更好的文档不是更好吗?这似乎比一个完整的dep管理系统更需要维护,这个管理系统更详细、更完善。谢谢,这很有帮助。请注意,可能需要使用
type=“jar”
限制
cachepath
,并且缓存路径也可以直接用于打包:@Vadzim我从未见过限制配置的需要。通常,配置映射(到远程“默认”配置)可以很好地确保只包含jar工件。我以前是这样做的,首先使用常春藤检索任务创建临时临时暂存目录,以便生成WAR或EAR文件。@马克,请与我分享一些想法好吗?我看到了,但不知道如何从常春藤配置中轻松减去依赖项。