常春藤conf属性的错误使用

时间:2014-08-27 13:16:07

标签: java ant ivy

我认为即使我已经阅读了教程,我也不太了解常春藤的conf功能。想想我有两个依赖;

  • guava.jar
  • foeu.jar

我只在编译时需要foeu.jar,但我不仅需要guava.jar编译时,还需要运行时。为了实现这些需求,我在ivy.xml中写道;

<configurations defaultconfmapping="runtime->compile">
    <conf   name="default" 
            visibility="public" />

    <conf   name="compile"      
            visibility="private"/>

    <conf   name="runtime"      
            extends="compile"   
            visibility="public"/>
</configurations>

和,依赖为;

<dependencies>          
    <dependency org="Google Guava"  name="guava-17.0"   rev="17.0"  
                conf="runtime->default"/>
    <dependency org="Foeu"  name="foeu" rev="5.5.1" 
                conf="compile->default"/>
</dependencies>

真的,conf对我的了解有些不对劲。有什么问题,我该怎么办?

更新

在build.xml中,我正在使用它;

常春藤初始化;

<target name="init-ivy" description="Initialize ivy requirements">
    <property   name="ivy.dep.file"     value="${script.directory}/ivy/ivy.xml" />

    <ivy:configure  file="${script.directory}/ivy/ivyconf.xml"/>

    <ivy:resolve/>
    <ivy:cachepath  pathid="ivy.compile.path"    conf="compile" />
    <ivy:cachepath  pathid="ivy.runtime.path" conf="runtime" />
</target>

编译;

<target name="compile"  depends="init-ivy"  description="Compiling Java source codes with external libraries">
    <javac  compiler="javac1.7"
            destdir="${class.directory}"
            source="1.7"
            target="1.7"
            failonerror="true"
            includeantruntime="false">

            <src    path="${source.directory}" />
            <classpath  refid="ivy.compile.path" />

    </javac>
</target>

<target name="create-jar"   depends="compile"   description="Creating jar files">
    <jar    destfile="${build.directory}/jar/${ant.project.name}.jar"
        basedir="${class.directory}">

        <manifest>
            <attribute name="Main-Class" value="dataScience.management.Management"/>    
        </manifest>
    </jar>
</target>

运行

<target name="runtime"  depends="create-jar"    description="Running Java based application">
        <java   jar="${jar.directory}/${ant.project.name}.jar"
                fork="yes"  
                maxmemory="400m">
                <jvmarg value="-ea"/>
                <classpath  refid="ivy.runtime.path" />
        </java>
</target>

1 个答案:

答案 0 :(得分:0)

配置是一个难以理解的概念。我的建议是为构建中的每个依赖项功能组创建一个。

你正在寻找的是&#34;延伸&#34;属性。它允许成员继承。例如:

<configurations>
    <conf name="compile" description="Libraries needed for compilation" />
    <conf name="runtime" extends="compile" description="Libraries needed at runtime"/>
</configurations>

通过这种方式,所有编译依赖项都自动成为运行时配置的一部分。

有关更详细的示例,请查看以下答案:

更新

这不是常春藤问题。可执行jar需要主类类路径存在于清单文件中。

按如下方式构建jar文件:

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

    <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>

常春藤检索任务使用运行时依赖项填充本地目录。 manifestclasspath任务创建了这些文件的相对链接列表,最后是&#34; Class-Path&#34;条目将添加到清单文件中。然后,您将能够按如下方式运行jar:

<java jar="${dist.jar}" fork="yes" maxmemory="400m">
        <jvmarg value="-ea"/>
</java>

总之,基本上有两种运行jar的方法。指定classpath和mainclass,或者使用清单中的主类和类路径创建jar。

希望这能解决您的问题。