ant和java的windows类路径问题

ant和java的windows类路径问题,java,ant,jar,classpath,manifest,Java,Ant,Jar,Classpath,Manifest,我已经在这些战壕里战斗了一段时间了,现在还没有开始工作。使用这里的许多示例以及其他类似或的示例,我仍然无法通过windows类路径限制。我目前正在处理一个ant任务,它在我的源代码中的java类中运行一个主方法。如果我能在这里工作,我可以在其他地方进行推断 首先,我的原始相关构建任务 <path id="code.classpath"> <path id="code.classpath"> <path refid="jars.code"/>

我已经在这些战壕里战斗了一段时间了,现在还没有开始工作。使用这里的许多示例以及其他类似或的示例,我仍然无法通过windows类路径限制。我目前正在处理一个ant任务,它在我的源代码中的java类中运行一个主方法。如果我能在这里工作,我可以在其他地方进行推断

首先,我的原始相关构建任务

<path id="code.classpath">
    <path id="code.classpath">
    <path refid="jars.code"/>
    <path refid="jars.common"/>
    <path refid="jars.servlet-api"/>
    <dirset dir="${code.dir}" excludes="xlib/scripts/**"/>
</path>
<target name="code.exec" description="Execute a class file">
    <echo>${code}</echo>
    <input addproperty="code.exec.class">Enter full class name (e.g. ${atmr.pkg}.FooBar):</input>
    <input addproperty="code.exec.args">Enter arguments:</input>
    <java classname="${code.exec.class}"
          fork="true"
          dir="${code.src.dir}"
          failonerror="true"
          classpathref="code.classpath">
        <jvmarg value="-Xmx4048M"/>
        <jvmarg value="-ea"/>
        <jvmarg value="-Dlog4j.configuration=file:${basedir}/log4j.xml"/>
        <syspropertyset refid="proxy.properties"/>
        <assertions refid="code.exec.assertions"/>
        <arg line="${code.exec.args}"/>
    </java>
</target>

${code}
输入完整的类名(例如${atmr.pkg}.FooBar):
输入参数:
接下来是我最近的一次解决方案尝试

<path id="code.source">
    <dirset dir="${code.dir}" excludes="xlib/scripts/**"/>
</path>

<target name="code.classpath.acme">
    <manifestclasspath property="jar.classpath" jarfile="${app.dir}/acme.jar">
        <classpath refid="code.source"/>
    </manifestclasspath>

    <jar destfile="${app.dir}/acme.jar" index="true">
        <manifest>
            <attribute name="Class-Path" value="${jar.classpath}"/>
        </manifest>
    </jar>
</target>

<path id="temp.classpath">
    <pathelement path="${app.dir}/acme.jar"/>
</path>
<target name="code.exec" description="Execute a class file" >
    <property name="myclasspath" refid="temp.classpath"/>
    <echo>${code}</echo>
    <echo>${basedir}</echo>
    <echo>${myclasspath}</echo>
    <input addproperty="code.exec.class">Enter full class name (e.g. ${atmr.pkg}.FooBar):</input>
    <input addproperty="code.exec.args">Enter arguments:</input>
    <java classname="${code.exec.class}"
          fork="true"
          dir="${code.src.dir}"
          failonerror="true"
          classpathref="temp.classpath">
        <jvmarg value="-Xmx4048M"/>
        <jvmarg value="-ea"/>
        <jvmarg value="-Dlog4j.configuration=file:${basedir}/log4j.xml"/>
        <syspropertyset refid="proxy.properties"/>
        <assertions refid="code.exec.assertions"/>
        <arg line="${code.exec.args}"/>
    </java>
</target>

${code}
${basedir}
${myclasspath}
输入完整的类名(例如${atmr.pkg}.FooBar):
输入参数:
基本上,当运行第一个时,我在windows中遇到了“类路径太长”的问题。运行第二个,我得到“找不到或加载主类package.classname”。我已经查看了在jar中创建的MANIFEST.MF,并且包位置存在。从这里开始,我沿着兔子洞走下去,寻找可能出现的情况。我已经测试了清单相对位置的不同排列,但没有结果。我甚至进入并手动将清单更改为显式文件位置(与jar无关),结果没有任何变化

为了确认整个代码正常工作,我可以将code.dir路径添加到temp.classpath中,并得到过长的错误。我还可以使用其中的类构建AcmeJAR,并解决缺少类的问题

无论我在哪里读到,这都应该有效。然而,我在这里。我知道如果在清单中找不到引用,它会自动跳过它。这就是它似乎在做的事情,但我已经尽了一切努力让它看到什么是徒劳的。因此,我向你们求助,请你们指出我错过的愚蠢错误,或者让我了解我尚未学到的秘密知识


提前感谢。

如果您至少能够获得“类路径太长”的答案,您可能与原始答案更接近

您是否尝试过将路径嵌套以使其“相关”而不是“绝对”,从而缩短路径?也许使用别名,例如在PATH变量中列出“JAVA_HOME”的方式

从命令行快速测试这一点的方法是编辑类路径,并确保在代码中重新设置时清除它。在如下所示的窗口中:

C:\WINDOWS>setx CLASSPATH "CLASSPATH;C:\some_new_path"
这将通过将新路径附加到现有路径值来更新路径。键入以下命令将在以后的所有CMD窗口中打印新路径;不在当前CMD窗口中:

C:\WINDOWS>CLASSPATH
键入以下内容将为您提供所有环境变量的列表:

C:\WINDOWS>set

我认为你不太理解这个问题。。。将数千条单独的路径缩短几个字符并不是我需要的解决方案。只有在我创建另一个类来再次推送长度之前,这种方法才有效。我需要获取所有这些单独的路径,并将它们压缩成单个(或少数)路径,这些路径指向实际上包含所有这些单独类的JAR。