ant和java的Windows类路径问题



我已经在这些战壕里战斗了一段时间了,但还没有让它工作。使用了SO上的许多例子,以及其他像这个博客或这个帖子的例子,我仍然无法超越windows类路径的限制。我目前正在处理一个ant任务,该任务在源代码中的java类中运行单个main方法。如果我能在这里工作,我可以在其他地方推广。

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

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

下一个,我最近尝试的解决方案

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

基本上,当运行第一个时,我在windows中得到"类路径太长"问题。运行第二个,我得到"无法找到或加载主类package.classname"。我已经看过清单了。在jar中创建的MF和包位置都是存在的。从这里开始,我的旅程进入了兔子洞,去寻找可能发生的事情。我测试了舱单相对位置的不同排列,但都无济于事。我甚至手动将清单更改为一个显式的文件位置(不是相对于jar),结果没有变化。

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

在我读到的所有地方,这应该都是有效的。然而,我在这里。我知道如果找不到舱单中的引用,它就会悄悄地跳过它。这似乎是它正在做的,但我已经尝试了一切让它看到什么是徒劳的。因此,我向你们这些贡献者求助,要么指出我错过的愚蠢错误,要么让我知道我还没有学到的秘密知识。

如果你至少能得到" classpath is too long "的答案,你可能更接近你原来的答案。

你是否尝试过嵌套路径,以使它们"相关"而不是"绝对",从而更短?也许使用一个别名,比如在PATH变量中列出"JAVA_HOME"的方式?

从命令行中快速测试这一点的一种方法是编辑类路径,并确保在尝试在代码中重新设置它时将其清除。在窗口中,它看起来像这样:

C:WINDOWS>setx CLASSPATH "CLASSPATH;C:some_new_path"

这将通过将新路径附加到现有路径值来更新PATH。输入以下命令将在未来所有CMD窗口中打印新的PATH;不在当前的CMD窗口:

C:WINDOWS>CLASSPATH

输入以下命令将会给出所有环境变量的列表:

C:WINDOWS>set

相关内容

  • 没有找到相关文章

最新更新