如何在Windows中设置一个长的Java类路径?

我试图在Windows XP命令行上手动运行特定的JUnit测试,该命令行在类路径中的元素数量异常多。我已经尝试了几个变体,例如:

set CLASS_PATH=C:\path\a\b\c;C:\path\e\f\g;....
set CLASS_PATH=%CLASS_PATH%;C:\path2\a\b\c;C:\path2\e\f\g;....
...
C:\apps\jdk1.6.0_07\bin\java.exe -client oracle.jdevimpl.junit.runner.TestRunner com.myco.myClass.MyTest testMethod

(其他变体是将classpath全部设置为一行,通过-classpath设置类路径作为java的参数)。它始终归结为控制台抛出它的手,出现此错误:

The input line is too long.
The syntax of the command is incorrect.

这是一个测试一个相当大的现有遗留项目的JUnit测试,因此没有关于将我的目录结构重新排列到更合理的建议,现在这些类型的解决方案。我只是试图对这个项目进行快速测试,并在命令行上运行它,并且控制台正在阻止我。帮帮我!

34

9 答案

Windows命令行在这方面非常有限。解决方法是创建一个“路径jar”。这是一个只包含一个 Manifest.mf 文件的jar,它的 Class-Path 指定了你的一长串jar包的磁盘路径等等。现在只需添加这个 pathing jar 到你的命令行类路径。这通常比将实际资源打包在一起更方便。

我记得,磁盘路径可以相对于 pathing jar 本身。因此, Manifest.mf 可能如下所示:

Class-Path: this.jar that.jar ../lib/other.jar

如果您的 pathing jar 包含主要的基础资源,那么它不会经常更改,但您可能仍希望在构建中的某个位置生成它。例如:


  
    
  

49
额外
我是否需要做任何事情,例如确保这个罐子被加载?或者JVM会扫描类路径上提供的所有类似此类清单的jar吗?另外,它是否可以跨JVM移植?支持这个的最低版本的Java是什么?
额外 作者 bacar,
自1.7版本开始,Ant中可用的ManifestClassPath任务可用于从Ant路径为Class-Path属性生成合适的属性。
额外 作者 Matt Hurne,
我试过了,但Manifest.mf 只允许相对URL 到其他JAR和目录。
额外 作者 xamde,
18
额外
这看起来像一个“仅链接答案”。你应该提供更多关于如何去做的细节。
额外 作者 rghome,
嘿,那很酷 - 我不知道那个。这绝对是一个有用的选项,尤其是如果(就像我们的情况一样),类路径中充满了罐子,其中许多罐子都在同一个目录中。
额外 作者 Ogre Psalm33,
这在Java 6中似乎是新的。
额外 作者 Chris Noe,
但是这不提供递归遍历。
额外 作者 Snehal Masne,

(我想你并不是指DOS,而是指cmd.exe。)

我认为它比环境大小/环境变量大小限制更少CLASSPATH限制。在XP上,单个环境变量可以是8k大小,整个环境限制为64k。我看不到你会达到这个极限。

在windows上有一个限制命令行长度的限制,在WindowsNT + cmd.exe是8k。设置的命令受到该限制。你可以在你的命令中使用超过8K的目录吗?那么你可能不太好运 - 即使你把它们分成了 Nick Berardi 建议。

4
额外
Woops,是的,老派正在渗透。是的,cmd.exe。
额外 作者 Ogre Psalm33,

你有尝试堆叠它们吗?

set CLASS_PATH = c:\path
set ALT_A = %CLASS_PATH%\a\b\c;
set ALT_B = %CLASS_PATH%\e\f\g;
...

set ALL_PATHS = %CLASS_PATH%;%ALT_A%;%ALT_B%
2
额外
我们尝试了一些这样的变化,无济于事。 CMD似乎取代那些%ALT_A%,等上即时和最终的路径卷起过长它来处理,给我同样的错误。
额外 作者 Ogre Psalm33,

If I were in your shoes, I would download the junction utility from MS : http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx and then map your "C:\path" to say, "z:\" and "c:\path2" to say, "y:\". This way, you will be reducing 4 characters per item in your classpath.

set CLASS_PATH=C:\path\a\b\c;C:\path\e\f\g;
set CLASS_PATH=%CLASS_PATH%;C:\path2\a\b\c;C:\path2\e\f\g;

Now, your classpath will be :

set CLASS_PATH=z\a\b\c;z\e\f\g;
set CLASS_PATH=%CLASS_PATH%;y:\a\b\c;y:\e\f\g;

它可能会做更多取决于您的实际 classpath

1
额外
连接点是NTFS中的一个前端。 mklink/D 是另一个,可能已经存在于更高版本的Windows中。
额外 作者 mgaert,
mlink似乎并未包含在Windows 7中。结点包含在Windows 7(企业版)中。
额外 作者 anjanb,

正如HuibertGill所提到的,我会将它包装在Ant构建脚本中,以便您不必自己管理所有这些。

0
额外

我认为你在这里没有划桨。 命令行对调用程序的参数有限制。

我有2个你可以尝试的消化。 首先,在运行junit测试之前,您可以让脚本/ ant_task在类路径中创建各种类的JAR。 然后,您可以将JAR放在类路径上,该路径应该更短。

你可以尝试的另一种方法是创建一个antscript来运行JUNIT, 在ANT中,类路径条目不应该有这样的限制。

0
额外

你可以试试这个


@echo off
set A=D:\jdk1.6.0_23\bin
set B=C:\Documents and Settings\674205\Desktop\JavaProj
set PATH="%PATH%;%A%;"
set CLASSPATH="%CLASSPATH%;%B%;"

转到命令提示符并运行两次(不知道为什么....我必须在Windows XP机器上这样做) 此外路径r仅为当前命令提示符会话设置

0
额外

除了通过将jar文件移动到像“C:\ jars”这样的文件夹来缩短类路径之外,没有解决这个问题的方法。

0
额外
不正确。还有另一个解决方案,但是你不知道它是什么,或者你决定不使用它。但是,你所做的肯定是一个解决方案......在某些情况下可以工作。
额外 作者 Stephen C,