我已经在这些战壕里战斗了一段时间了,但还没有让它工作。使用了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