1

我有一个项目很快就要到期了,一切都很好地结合在一起,但是 java 类路径正在变得严重。我会尽量清楚和彻底地解释情况。

所以我们使用 Javacc 来编写编程语言。javacc 文件编译成几个 java 文件。Parser.java 文件包括对其他生成的 java 文件的引用和调用。因此,在生成之后,我们编译 Parser.java 文件。问题是我们遇到了很多错误,包括无法识别对其他 java 文件以及我们自己的文件的调用。我们在课堂讨论板上询问了我们的问题,教授回答说“你需要在你的类路径中包含类文件”。好的,很好,所以问题是,我们如何做到这一点?基本上,我们有一个目录,其中包含生成的 java 文件和我们的其他帮助文件。

那么,我们尝试了什么?

我尝试更改我的 .bashrc (Ubuntu) 文件以包含正确的类路径,但这不起作用。IE

 CLASSPATH=Home/project

(就像我在文件中的语法一样)

我试过编译执行

javac -cp . Parser.java

javac -cp "." Parser.java

两者都不起作用。

我试图在我们的文件目录中编辑 xml(我认为是 xml).classpath 文件。还是不行。

不知何故,我能够在我拥有的一个目录中编译 Parser.java(我们最终创建了多个目录,其中包含相同的文件,但徒劳无功)但是当我尝试运行时

java -cp . Parser.java

或者

java Parser.java

它说它找不到 main 并抛出(我相信,它在我的另一台计算机上)ClassNotFound 或 ClassNotDefined 异常(类似的,它无法在 Parser 文件中找到 main,即使它在那里)。

我们尝试将包减速和导入语句添加到我们的文件中,但似乎没有任何效果。

基本上:如何成功更改类路径,以便可以在我的机器上编译和运行我的 java 文件(都在一个目录中而不是 jarred)?

谢谢您的帮助。我非常感激。

4

3 回答 3

2

我强烈建议您研究Ant。一个简单的构建文件可以为您解决所有这些问题。

您无需编辑您的.bashrcCLASSPATH.

从命令行,您需要一起构建所有 java 文件。我不确定 JavaCCjavacc.jar在生成 Lexer 和 Parser 后是否需要。但是让我们假设它适用于一些通用的 AST 支持。

javacc.jar位于~/javacc-5.0/lib/javacc.jar

场景一:简单的目录结构,所有Java文件都在没有包的根目录下。

root
  | Parser.java
  | Lexer.java
  | Program.java

要编译这些我需要运行:

javac -cp ~/javacc-5.0/lib/javacc.jar Parser.java Lexer.java Program.java

那么我可以Program像这样执行,如果程序有main

java -cp ~/javacc-5.0/lib/javacc.jar:. Program

场景 2:中等目录结构,根目录中的代码但带有包。

root
  | org
     | myproject
          | Parser.java
          | Lexer.java
          | Program.java

那么你需要像这样执行javac:

javac -cp ~/javacc-5.0/lib/javacc.jar org/myproject/Parser.java org/myproject/Lexer.java org/myproject/Program.java

并执行

java -cp ~/javacc-5.0/lib/javacc.jar:. org.myproject.Program

场景 3:复杂的目录结构,包含包的特定源目录。

root
   | src
      | org
          | myproject
              | Parser.java
              | Lexer.java
              | Program.java

那么你需要像这样执行javac:

javac -cp ~/javacc-5.0/lib/javacc.jar -sourcepath src src/org/myproject/Parser.java src/org/myproject/Lexer.java src/org/myproject/Program.java

并执行

java -cp ~/javacc-5.0/lib/javacc.jar:src org.myproject.Program

于 2012-04-23T05:54:33.013 回答
0

javac和之间有区别java。你试图以错误的方式使用它们。javac是生成 *.class 文件的编译器(在您的情况下为 Parser.class)。这个 *.class 文件必须由java.

所以如果我有文件 Parser.java

class Parser {

  public static void main(String[] args) {
    System.out.println("Hi");
  }

}

我会去这个文件所在的目录并在 shell 中运行:

javac Parser.java

比运行编译的文件

java Parser

就是这样。注意java文件中的类名必须与文件名相同。

于 2012-04-23T05:59:32.203 回答
-2
  1. 创建所有已编译类的 Jar 文件。有关如何创建 jar 文件的信息,请参阅本教程。

  2. 用这个命令开始你的程序

     java -classpath pathToJarFile com.abc.MainClass
    
于 2012-04-23T05:43:28.633 回答