2014-08-27 119 views
0

即使我已经阅读了教程,我仍然无法理解ivy的conf功能。想想我有两个依赖;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> 

and,dependency as;

<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理解了我的错。有什么问题,我该怎么办?

UPDATE:

在build.xml中,我使用它喜欢;

ivy-initialization;

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

compile;

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

回答

0

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

你要找的位是“扩展”属性。它使成员继承成为可能。例如:

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

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

对于更详细的例子来看看下面的回答:

更新

这不是常春藤问题。可执行文件包需要main类 classpath存在于清单文件中。

建立你的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任务创建一个到这些文件的相对链接列表,最后将“Class-Path”条目添加到清单文件中。然后,您将能够如下运行该罐子:

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

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

希望这可以解决您的问题。

+0

即使你说我变了,蚂蚁发出同样的问题,在线程'异常“主要” java.lang.NoClassDefFoundError:COM /谷歌/普通/基/试图运行我的番石榴项目Preconditions'。 – Hevan 2014-08-27 13:52:38

+0

听起来像使用的类路径存在问题(没有像配置那样填充),或者使用的本地jar不是您认为的版本。为什么?该类存在于Maven Central jar副本中。请参阅:http://search.maven.org/#search|ga|1|g%3A%22com.google.guava%22%20AND%20a%3A%22guava%22%20AND%20v%3A%2217.0%22 %20于是%20fc%3A%22com.google.common.base.Preconditions%22,你能告诉你如何使用您的build.xml配置更多的细节? – 2014-08-27 14:02:34

+0

我用build.xml编辑了问题。 – Hevan 2014-08-27 14:10:03