Java:设置Classpath

时间:2012-04-23 05:38:42

标签: java classpath javacc

我有一个项目即将到期,一切都很好地融合在一起,但java类路径正在认真对待。我会尽可能清楚彻底地解释这种情况。

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

那么,我们尝试了什么?

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

 CLASSPATH=Home/project

(类似于我在文件中使用了语法)

我已经尝试过编译执行

javac -cp . Parser.java

javac -cp "." Parser.java

既不起作用。

我试图在我们的文件目录中编辑xml(我认为是xml).classpath文件。仍然无效。

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

java -cp . Parser.java

java Parser.java

它说它无法找到main和throws(我相信,它在我的另一台计算机上)ClassNotFound或ClassNotDefined异常(类似的东西,它找不到Parser文件中的main,尽管它在那里)。

我们尝试将包减速和导入语句添加到我们的文件中,似乎没什么用。

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

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

3 个答案:

答案 0 :(得分:2)

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

您无需修改​​.bashrcCLASSPATH

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

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

场景1:简单的目录结构,所有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

答案 1 :(得分:0)

javacjava之间存在差异。你试图以错误的方式使用它们。 javac是一个生成* .class文件的编译器(在你的例子中是Parser.class)。然后必须由java运行此* .class文件。

所以,如果我有文件Parser.java

class Parser {

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

}

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

javac Parser.java

比运行编译文件

java Parser

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

答案 2 :(得分:-2)

  1. 创建所有已编译类的Jar文件。有关如何创建jar文件,请参阅此tutorial

  2. 使用此命令开始编程

     java -classpath pathToJarFile com.abc.MainClass