代码之家  ›  专栏  ›  技术社区  ›  Ogre Psalm33

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

  •  39
  • Ogre Psalm33  · 技术社区  · 16 年前

    我正试图在WindowsXP命令行上手动运行一个特定的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
    

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

    这是一个JUnit测试,测试的是一个相当大的现有遗留项目,因此没有关于将我的目录结构重新安排到更合理的位置的建议,这些类型的解决方案现在已经过时了。我只是想对这个项目进行一个快速测试,并在命令行上运行它,而控制台却在阻挠我。帮助

    10 回复  |  直到 10 年前
        1
  •  59
  •   Chris Noe Paweł Dyda    8 年前

    Windows命令行在这方面非常有限。解决方法是创建一个“路径jar”。这是一个只包含一个容器的罐子 Manifest.mf 档案,谁的 Class-Path 开槽罐 到您的命令行类路径。这通常比将实际资源打包在一起更方便。

    我记得,磁盘路径可以是相对于 Manifest.mf 可能看起来像这样:

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

    如果你的 开槽罐

    <jar destfile="pathing.jar">
      <manifest>
        <attribute name="Class-Path" value="this.jar that.jar ../lib/other.jar"/>
      </manifest>
    </jar>
    
        2
  •  20
  •   TmTron    7 年前

    因为Java6可以使用 classpath wildcards .

    foo/* ,引用目录中的所有.jar文件 foo

    • 这与类文件(仅jar文件)不匹配。要使两者匹配,请使用: foo;foo/* foo/*;foo . 顺序决定首先加载的内容。
    • 搜索不是递归的
        3
  •  12
  •   Raman    6 年前

    在Java9上使用“参数文件”+

    在Java9+中,Java可执行文件支持通过文件提供参数。看见 https://docs.oracle.com/javase/9/tools/java.htm#JSWOR-GUID-4856361B-8BFD-4964-AE84-121F5F6CF111 .

    您可以使用@argument文件来缩短或简化java命令 类名称,传递给java命令。 这让您能够创建java 任何操作系统上任意长度的命令。

    在命令行中,使用at符号(@)前缀标识 包含java选项和类名的参数文件。当 java命令遇到一个以at符号(@)开头的文件,它 将该文件的内容展开为参数列表,就像它们一样 将在命令行上指定。

    如果您运行的是版本9或更高版本,这是“正确”的解决方案。这个机制只是修改如何将参数提供给JVM,以及 因此,它与任何框架或应用程序都是100%兼容的 ,不管它们如何进行类加载,也就是说,它完全等同于像往常一样在命令行上提供参数。对于基于清单的解决方案,此操作系统限制并非如此。

    这方面的一个例子是:

    java -cp c:\foo\bar.jar;c:\foo\baz.jar

    可以重写为:

    java @c:\path\to\cparg

    哪里 c:\path\to\cparg 是一个包含以下内容的文件:

    -cp c:\foo\bar.jar;c:\foo\baz.jar
    

    -cp "\
    c:\foo\bar.jar;\
    c:\foo\baz.jar"
    

    格拉德尔

    如果您在Gradle中遇到此问题,请参阅此插件,它会自动将您的类路径转换为“参数文件”,并在Windows上执行exec或测试任务时提供给JVM。在Linux或其他操作系统上,默认情况下它什么也不做,尽管可以使用可选的配置值来应用转换,而不考虑操作系统。

    https://github.com/redocksoft/classpath-to-file-gradle-plugin

    另请参阅此相关的Gradle问题——希望此功能最终将集成到Gradle core中: https://github.com/gradle/gradle/issues/1989 .

        4
  •  4
  •   Community CDub    8 年前

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

    windows上有限制命令行长度的限制,在WindowsNT+上,cmd.exe的长度为8k。set命令受该限制。您的set命令中是否有超过8k个目录?那么,你可能运气不好——即使你像这样把他们分开 Nick Berardi 建议。

        5
  •  2
  •   user1921819    6 年前

    拉曼光谱 用于为Java 9+的路径问题引入新的解决方案。我匆匆忙忙地去了 bootRun

    // Fix long path problem on Windows by utilizing java Command-Line Argument Files 
    // https://docs.oracle.com/javase/9/tools/java.htm#JSWOR-GUID-4856361B-8BFD-4964-AE84-121F5F6CF111 
    // The task creates the command-line argument file with classpath
    // Then we specify the args parameter with path to command-line argument file and main class
    // Then we clear classpath and main parameters
    // As arguments are applied after applying classpath and main class last step 
    // is done to cheat gradle plugin: we will skip classpath and main and manually
    // apply them through args
    // Hopefully at some point gradle will do this automatically 
    // https://github.com/gradle/gradle/issues/1989 
    
    if (Os.isFamily(Os.FAMILY_WINDOWS)) {
        bootRun {
            doFirst {
                def argumentFilePath = "build/javaArguments.txt"
                def argumentFile = project.file(argumentFilePath)
                def writer = argumentFile.newPrintWriter()
                writer.print('-cp ')
                writer.println(classpath.join(';'))
                writer.close()
    
                args = ["@${argumentFile.absolutePath}", main]
                classpath = project.files()
                main = ''
            }
        }
    }
    
    
        6
  •  1
  •   Dhanuka Maddy    10 年前

    如果我是你,我会从MS下载junction实用程序: http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx “C:\path”表示“z:\”,而“C:\path2”表示“y:\”。这样,您将在您的应用程序中每项减少4个字符 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;
    

    现在,您的类路径将是:

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

    它可能会根据您的实际情况做得更多 类路径 .

        7
  •  0
  •   Huibert Gill    16 年前

    命令行对调用程序的参数有限制。

    我有两个建议你可以试试。 然后可以将jar放在类路径上,该路径应该更短。

    您可以尝试的另一种方法是创建一个antscript来运行JUNIT,

        8
  •  0
  •   matt b    16 年前

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

        9
  •  0
  •   Taryn Frank Pearson    12 年前


    @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仅为当前命令提示符会话设置

        10
  •  0
  •   Snehal Masne    8 年前

        11
  •  0
  •   Trushit Shekhda    5 年前

    修复windows gradle长类路径问题。修复了JavaExec任务出现错误并显示消息“CreateProcess error=206,文件名或扩展名太长”

    使用插件DSL:

    plugins {
      id "com.github.ManifestClasspath" version "0.1.0-RELEASE"
    }
    

    使用旧插件应用程序:

    buildscript {
      repositories {
        maven {
          url "https://plugins.gradle.org/m2/"
        }
      }
      dependencies {
        classpath "gradle.plugin.com.github.viswaramamoorthy:gradle-util-plugins:0.1.0-RELEASE"
      }
    }
    
    apply plugin: "com.github.ManifestClasspath"
    
        12
  •  0
  •   user16106533    4 年前

    我在这里遇到了一个类似的问题,在.bat文件中有一个巨大的类路径定义。 问题是,这个类路径还包括了执行路径到巨型路径中,这是正确的,这是有意义的。

    我只是把所有文件移到一个较短的位置。 例如,我试图在目录树中执行软件,如: c:\softwares\testing\testing\u solution\one

    我把整个结构移动到这样一个点

    c:\测试

    软件运行得很好。

    Tks

        13
  •  -2
  •   Nick Berardi    16 年前

    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%