【问题标题】:How to run javac with paths as argument that contain white spaces?如何使用路径作为包含空格的参数运行 javac?
【发布时间】:2012-01-19 23:33:16
【问题描述】:

我正在尝试运行以下

javac -Xlint:unchecked -classpath C:/Users/a b/workspace/ @C:/Users/a b/workspace/files_to_compile

但我得到了一个

javac: invalid flag C:/users/a

我也尝试用双引号将两条路径括起来,但似乎没有一点帮助:

javac -Xlint:unchecked -classpath "C:/Users/a b/workspace/" @"C:/Users/a b/workspace/files_to_compile"

我做错了什么?相同的代码在其他计算机上也能正常工作(可能是因为它们的路径中没有任何空白......)。

谢谢

【问题讨论】:

  • 添加了 Windows 标签,因为我认为这是一个 Windows CLI 问题,而不是 Java 问题。
  • 我刚刚读了一篇博客,说展示如何解决错误比给出解决方案更好。所以:首先尝试使用没有空格的路径。引入引号。然后是空白的类路径,然后是空白的@。在@前引用。试试反斜杠。
  • 双引号对我来说很好用。您使用的是什么版本的 Java SDK?
  • "java version "1.7.0" Java(TM) SE Runtime Environment (build 1.7.0-b147) Java HotSpot(TM) 64-Bit Server VM(build 21.0-b17,混合模式) "
  • 带有双引号的第二个版本应该可以正常工作。您可以发布 files_to_compile 的内容吗?那里列出的任何包含空格的路径也需要被引用。

标签: windows javac


【解决方案1】:

我终于想出了这个问题的解决方案,我想这里没有人能猜到。

答案的线索在于文件列表的内容(在 args 中以 @ 表示)通常具有其每个字符串,其初始子字符串等于作为类路径和传递的字符串@ 文件。

所以..

问题从来不是命令行参数,正如建议的那样,而是@文件的内容。

文件的每一行都必须放在自己的行中,并用引号括起来,并且考虑到如果您在 Windows 中,则必须以C:\\a\\b\\c.txt 的形式输入文件名!!!

【讨论】:

    【解决方案2】:

    你的第二次尝试是对的

    javac -Xlint:unchecked -classpath "C:/Users/a b/workspace/" @"C:/Users/a b/workspace/files_to_compile"
    

    但要完整,您必须使用以下方法将空格转义到文本文件“files_to_compile”中:

    • 与属性文件的语法相同:\

    • 每行双引号

    我建议第二个,但我不确定。

    【讨论】:

    • 差不多了,这很奇怪,但我现在才看到这个答案!
    【解决方案3】:

    我不得不承认这比我想象的要困难。 经过反复试验,我想出了以下几点:

    C:\lol>"C:\Program Files\Java\jdk1.7.0_07\bin\javac" -cp "c:\lol\a b;c:\lol\foo bar" Lol.java

    文件夹结构如下:

    ./foo bar
    ./foo bar/Moo.java
    ./Lol.java
    ./a b
    ./a b/AB.java
    

    我用文件夹和 java 文件制作了一个存档,您可以在以下位置获取: http://www.pvv.ntnu.no/~rakhmato/tmp/lol.tar

    您应该忽略 @ 选项,因为它足以为编译器提供一个文件和正确的类路径,它可以自行确定所有内容的位置。只需将您的 Main.java 提供给编译器,它就会找出该文件所依赖的内容。

    我还建议您编写一个 .bat 脚本以使事情变得更简单。没什么花哨的,像这样的:

    编译.bat:

    "C:\Program Files\Java\jdk1.7.0_07\bin\javac" -classpath "c:\lol\a b;c:\lol\foo bar" Main.java

    ..把它放在你的项目文件夹中并从 CMD 运行 compile.bat

    【讨论】:

    • "插入符号确实直接回答了我的问题,所以我会接受你的回答。不幸的是,SVN 命令似乎无法识别它!"
    • 以前没有人在他们的文件夹中有空间,当然也没有人试图编译 Java 类。
    • 我只是在说明一个显而易见的问题:您自己的第一个链接中提出的问题仍未解决,因此当您告诉我们“这已经得到解答”时,我很担心。当然可以这样说,尽管添加了附录:“但没有解决!”
    • "如果您仍然遇到问题,请尝试用冒号分隔路径。"只有一条路..
    • 好的。那个@在里面干什么?我以为你用它来分隔路径。
    【解决方案4】:
    • 首先在 shell 中使用 cd 命令将您的目录转移到保存文件的目录。

      cd /home/sayantani/PERSONAL\ FILES/sem\ 4\ courses/PLC/code/
      
    • 请注意,只要涉及空间,我就使用“\”。 “个人文件”变为“个人\文件”。

    • 然后使用“javac filename.java”

      javac hello1.java
      

    这应该可以解决您的问题。 请注意,在默认目录的整个路径上执行“javac”不起作用。(对我来说)

    【讨论】:

      【解决方案5】:

      您需要转义空格。

      在每个空格前面加上\,然后试试。

      【讨论】:

      • 令人讨厌的是,反斜杠不会在 Windows 上转义;它们用于文件路径
      【解决方案6】:

      它只占用源字符串的第一部分,从路径中删除 a b 之间的空格,它应该可以正常工作 C:/Users/a_b/workspace/" @"C:/Users/a_b/workspace/files_to_compile" 。永远不要在路径中包含空格,否则编译器将忽略后面的部分,否则您可以在 a\ b 之间放置一个“\”@

      【讨论】:

        【解决方案7】:

        有点小技巧,但如果您使用的是 Windows 7,则可以使用 mklink 实用程序创建另一个指向同一位置但没有空格的文件夹来解决此问题。

        编辑:也许是更好的解决方案:

        cd "C:/Users/a b/"
        javac ... -classpath "Workspace" ...
        

        【讨论】:

        • 这是一个通用工具,我不能依赖这个事实。
        • ^ 是否转义空格?例如。 ... -classpath "C:/Users/a^ b/workspace"
        • :(改变目录可行吗?
        • 今晚晚些时候我会试试。看起来并不可怕。
        【解决方案8】:

        来自“java /?”的使用信息

        C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC>cd "C:\Program Files (x86)\Java\jre6\bin"
        
        C:\Program Files (x86)\Java\jre6\bin>java.exe
        Usage: java [-options] class [args...]
               (to execute a class)
        or  java [-options] -jar jarfile [args...]
               (to execute a jar file)
        
        where options include:
        -client       to select the "client" VM
        -server       to select the "server" VM
        -hotspot      is a synonym for the "client" VM  [deprecated]
                      The default VM is client.
        
        -cp <class search path of directories and zip/jar files>
        -classpath <class search path of directories and zip/jar files>
                      A ; separated list of directories, JAR archives,
                      and ZIP archives to search for class files.
        

        -classpath 表示多条路径需要使用分号(“;”)。

        【讨论】:

          【解决方案9】:

          我无法对其进行测试,但我建议如下(因为 dmcgil 建议分号应该是 Windows 上的类路径分隔符):

          javac -Xlint:unchecked -classpath C:\Users\a^ b\workspace\;C:\Users\a^ b\workspace\files_to_compile
          

          看来escape charachter for win shell is caret

          也建议here

          编辑:

          另外,在您的问题中,我注意到路径中使用了斜杠 (/),不是所有版本的 Windows 都使用反斜杠 (\) 作为文件分隔符吗?我在这个帖子的某个地方看到了你的评论,说明了这一点,所以我猜你有问题打错了。

          【讨论】:

          • 过去有人建议使用 ^,虽然它在 cd 时确实有效,但它不能作为 javac 参数。
          猜你喜欢
          • 2011-05-19
          • 2011-04-13
          • 1970-01-01
          • 1970-01-01
          • 2018-09-14
          • 2018-07-08
          • 2016-03-01
          • 2012-02-26
          • 1970-01-01
          相关资源
          最近更新 更多