【问题标题】:How can I compile and run a Java class in a different directory?如何在不同的目录中编译和运行 Java 类?
【发布时间】:2010-08-05 14:10:42
【问题描述】:

我正在编写一个在不同目录中编译.java 文件的makefile,然后我想在不更改目录的情况下运行它。我想做一些类似的事情:

$(SQM_JAVA_TOOL_DONE) : $(SQM_JAVA_TOOL)
        $(shell cd /home_dir)
        javac myjavafile.java
        java myjavafile

Java 文件是/home/myjavafile.java,而makefile 不是从/home 运行的。

我该怎么做?

【问题讨论】:

  • 你为什么不创建一个 Ant 脚本并将完整路径传递给 ant build.xml 来编译你的 java 文件?

标签: java javac


【解决方案1】:

我可能误解了这个问题,但你可以编译

javac /home/MyJavaFile.java

这将在/home 中创建MyJavaFile.class

然后您可以通过在类路径中包含/home 来运行它。例如

java -cp /home MyJavaFile

如果你想在不同的目录中生成类文件,那么你可以使用-d 选项到javac

【讨论】:

  • 我试过java -cp ".:lib/dropbox-core-sdk-1.7.5.jar:lib/jackson-core-2.2.3.jar:lib/javax.mail.jar" /bin Client1,但链接器吐出:Error: Could not find or load main class .bin
  • @Andrei,只需将“/bin”放在客户端之前,将所有带有 .classes 的 jar 或文件夹放在“-cp”的双引号之间,放在主类名称之后。
【解决方案2】:

使用-d 命令行参数和javac 告诉它您希望将编译后的类文件存储在哪个目录中。然后,要运行程序,只需将此目录包含在类路径中:

javac -d some/directory myjavafile.java
java -cp some/directory myjavafile

【讨论】:

    【解决方案3】:

    只是为了添加到现有答案,您可能需要--source-path 标志:

    --source-path <path>, -sourcepath <path>
          Specify where to find input source files
    

    我相信这有效地设置了包根 javac 将从中编译(即 &lt;path&gt; 将从文件的预期包名称中删除)。仍然需要枚举要编译的文件,这应该仍然是相对于当前工作目录的,不是传递给--source-path的路径。

    例如,要从项目的根目录编译和运行,其中源存储在 src/ 中,并且您希望它在 bin/ 中构建:

    $ javac --source-path src -d bin src/mypackage/*.java
    $ java -cp bin mypackage.Main
    

    这甚至适用于文件系统中其他地方的目录,例如:

    $ javac --source-path /some/absolute/path/src  -d /some/absolute/path/bin /some/absolute/path/
    $ java -cp /some/absolute/path/bin mypackage.Main
    

    【讨论】:

      【解决方案4】:

      我正在使用 VS Code 并安装了 javacode runner 扩展。当我使用扩展创建新的 java 项目时,它是在 src 而不是 bin 中创建 .class 文件。为了解决这个问题,我从 File > Preferences > Settings 打开了 settings.json 文件并搜索了“settings”(或“code-runner”)。然后我在该文件中添加了以下几行。

      "code-runner.executorMap": {
          "java": "cd \"$workspaceRoot\\\" && javac --source-path src -d bin src\\$fileName && java -cp bin $fileNameWithoutExt",
      }
      

      如果您不想看到在代码文件之前运行的命令,请添加以下行:

      "code-runner.clearPreviousOutput": true,
      "code-runner.showExecutionMessage": false,
      "code-runner.executorMap": {
          "java": "there is && clear added in the execution paramater"
          "java": "cd \"$workspaceRoot\\\" && javac --source-path src -d bin src\\$fileName && clear && java -cp bin $fileNameWithoutExt",
      }
      

      我希望这能找到有类似问题的人。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-08
        • 1970-01-01
        相关资源
        最近更新 更多