2013-06-02 32 views
0

看來,我從我的maven倉庫中取出的罐子沒有放入我的java classpath中。我認爲常春藤緩存照顧這個?使用常青藤的NoClassDefFoundError。罐子沒有添加到classpath

每當我在eclipse或eclipse外運行一個類時,都會得到NoClassDefFoundError。 它編譯正常,但在運行時不起作用。我的依賴conf被設置爲運行時 - >默認,所以我認爲這將工作。

下面是我使用的文件。難道我做錯了什麼?

的ivy.xml

<?xml version="1.0" encoding="UTF-8"?> 
<ivy-module version="2.0" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:m="http://ant.apache.org/ivy/maven" 
      xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd"> 
    <info organisation="org_test" module="mod_test" /> 
    <configurations> 
    <conf name="compile" description="Required to compile application" /> 
    <conf name="runtime" description="Additional run-time dependencies" extends="compile" /> 
    <conf name="test" description="Required for test only" extends="runtime" /> 
    </configurations> 
    <publications> 
     <artifact ext="jar" /> 
     <artifact ext="pom" /> 
    </publications> 
    <dependencies> 
     <dependency org="org.apache.solr" name="solr-core" rev="3.5.0" conf="runtime->default" /> 
     <dependency org="org.apache.solr" name="solr-solrj" rev="3.6.0" conf="runtime->default" /> 
    </dependencies> 
</ivy-module> 

ivysettings.xml

<?xml version="1.0" encoding="UTF-8"?> 
<ivysettings> 
    <settings defaultResolver="chained" /> 
    <property name="maven.pattern" value="[organisation]/[module]/[revision]/[module]-[revision](-[classifier]).[ext]" /> 
    <property name="public.repo.url" value="http://${repo.host}:${repo.port}/nexus/content/groups/public/" override="false" /> 
    <property name="repo.host" value="localhost" override="false" /> 
    <property name="repo.port" value="8081" override="false" /> 
    <property name="repo.path" value="nexus/content/repositories" override="false" /> 
    <property name="retrieve.resolver" value="chained" override="false" /> 
    <resolvers> 
     <ibiblio name="public" m2compatible="true" root="${public.repo.url}" /> 
     <chain name="chained" returnFirst="false"> 
      <resolver ref="public" /> 
     </chain> 
    </resolvers> 
</ivysettings> 

common.xml

<project name="common" xmlns:ivy="antlib:org.apache.ivy.ant"> 

    <dirname property="ivy-support.build.dir" file="${ant.file.ivy-support}" /> 
    <property name="ivy-support.lib.dir" location="${ivy-support.build.dir}/ivy" /> 
    <property name="ivy.settings.filename" value="ivysettings.xml" /> 

    <property name="ivy.install.version" value="2.1.0-rc2" /> 
    <condition property="ivy.home" value="${env.IVY_HOME}"> 
     <isset property="env.IVY_HOME" /> 
    </condition> 
    <property name="ivy.home" value="${user.home}/.ant" /> 
    <property name="ivy.jar.dir" value="${ivy.home}/lib" /> 
    <property name="ivy.jar.file" value="${ivy.jar.dir}/ivy.jar" /> 

    <target name="download-ivy" unless="offline"> 

     <mkdir dir="${ivy.jar.dir}"/> 
     <!-- download Ivy from web site so that it can be used even without any special installation --> 
     <get src="http://repo2.maven.org/maven2/org/apache/ivy/ivy/${ivy.install.version}/ivy-${ivy.install.version}.jar" 
      dest="${ivy.jar.file}" usetimestamp="true"/> 
    </target> 

    <target name="init-ivy" depends="download-ivy"> 
     <!-- try to load ivy here from ivy home, in case the user has not already dropped 
       it into ant's lib dir (note that the latter copy will always take precedence). 
       We will not fail as long as local lib dir exists (it may be empty) and 
       ivy is in at least one of ant's lib dir or the local lib dir. --> 
     <path id="ivy.lib.path"> 
      <fileset dir="${ivy.jar.dir}" includes="*.jar"/> 
     </path> 
     <taskdef resource="org/apache/ivy/ant/antlib.xml" 
       uri="antlib:org.apache.ivy.ant" classpathref="ivy.lib.path"/> 
    </target> 


    <path id="ivy.lib.path"> 
     <fileset dir="${ivy-support.lib.dir}" includes="*.jar" /> 
    </path> 
    <taskdef resource="org/apache/ivy/ant/antlib.xml" uri="antlib:org.apache.ivy.ant" classpathref="ivy.lib.path" loaderref="ivy.lib.loader" /> 

    <ivy:settings file="${ivy-support.build.dir}/${ivy.settings.filename}" /> 

    <property name="should.clean.ivy.cache" value="false" /> 

    <dirname property="ivy-support.build.dir" file="${ant.file.ivy-support}" /> 
    <property name="ivy-support.lib.dir" location="${ivy-support.build.dir}/ivy" /> 
    <property name="ivy.settings.filename" value="ivysettings.xml" /> 

    <path id="ivy.lib.path"> 
     <fileset dir="${ivy-support.lib.dir}" includes="*.jar" /> 
    </path> 
    <taskdef resource="org/apache/ivy/ant/antlib.xml" uri="antlib:org.apache.ivy.ant" classpathref="ivy.lib.path" loaderref="ivy.lib.loader" /> 

    <ivy:settings file="${ivy-support.build.dir}/${ivy.settings.filename}" /> 

    <target name="clean-ivy-cache" if="clean.ivy.cache.istrue"> 
     <ivy:cleancache /> 
    </target> 
</project> 

的build.xml

<project name="main" xmlns:ivy="antlib:org.apache.ivy.ant" default="compile"> 
    <description>Testing Script</description> 
    <import file="common.xml" /> 

    <!-- 
    ================ 
    Build properties 
    ================ 
    --> 
    <property name="src.dir" location="src/org"/> 
    <property name="build.dir" location="build"/> 
    <property name="classes.dir" location="${build.dir}/classes"/> 
    <property name="test.classes.dir" location="${build.dir}/test-classes"/> 
    <property name="ivy.reports.dir" location="${build.dir}/ivy-reports"/> 
    <property name="test.reports.dir" location="${build.dir}/test-reports"/> 

    <!-- 
    =========== 
    Build setup 
    =========== 
    --> 
    <target name="init"> 
     <ivy:resolve file="ivy.xml" /> 

     <ivy:report todir='${ivy.reports.dir}' graph='false' xml='false'/> 

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

     <mkdir dir="${classes.dir}"/> 
     <mkdir dir="${test.classes.dir}"/> 
     <mkdir dir="${test.reports.dir}"/> 
    </target> 

    <!-- 
    =============== 
    Compile target 
    =============== 
    --> 
    <target name="compile" depends="init"> 
     <javac srcdir="${src.dir}" destdir="${classes.dir}" includeantruntime="true" debug="true" classpathref="runtime.path"/> 
    </target> 

    <!-- 
    ===================== 
    Build and run targets 
    ===================== 
    --> 
    <target name="run" depends="init-ivy"> 
     <java classname="org"> 
      <classpath> 
       <path refid="runtime.path"/> 
       <pathelement location="${classes.dir}"/> 
      </classpath> 
     </java> 
    </target> 

    <!-- 
    ============= 
    Clean targets 
    ============= 
    --> 
    <target name="clean"> 
     <delete dir="${build.dir}"/> 
    </target> 

    <target name="clean-all" depends="clean"> 
     <ivy:cleancache/> 
    </target> 

</project> 
+0

你的錯誤究竟是什麼?我注意到你的「運行」目標有一個「依賴」屬性,它調用與ivy相關的目標,但不編譯你的代碼。這是問題嗎?在運行時丟失類,因爲本地源未被編譯?最後你說它不能從Eclipse工作。由於常春藤是ANT插件,因此這是具有誤導性的。你有沒有嘗試從命令行運行ANT? –

回答

0

是的,在常春藤有bug ..發生這種情況。看看人們給出的錯誤和解決方案。它爲我工作。解決方法是您必須禁用編譯保存選項爲您的項目。檢查這是否有幫助。

相關問題