关于Linux上Java的类路径设置

时间:2012-01-23 09:52:19

标签: java openjdk

大家。

我在arch linux上使用openjdk-7。我最近开始学习Java,遇到了这样的问题:

我在/home/hqwrong/Code/java/mew/Mouth.java创建了一个文件:

package mew;

public class Mouth{
   public static void main(String argv[]){
       pickle.Say s = new pickle.Say();
  }
}

和/home/hqwrong/Code/java/pickle/Say.java中的另一个:

package pickle;

public class Say{
   public Say(){
      System.out.println("Say");
   }
}

我将Say.java编译为Say.class,使用:

$ cd /home/hqwrong/Code/java/pickle
$ javac Say.java

这是成功的。

我编译了Mouth.java,使用:

$ cd ../mew
$ export CLASSPATH=.:/home/hqwrong/Code/java/
$ javac Say.java

没有错误信息。

但在我输入后:

$ java Say

我得到了:

Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.mew
at java.lang.ClassLoader.preDefineClass(ClassLoader.java:649)
at java.lang.ClassLoader.defineClass(ClassLoader.java:785)
 at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:472)

使用时也一样:

$ java -cp $CLASSPATH Say

我需要你的帮助吗?

2 个答案:

答案 0 :(得分:7)

由于还没有好的答案,我会发布我的。

首先,您应该为您的课程和资源提供单独的文件夹。我建议您使用java/src作为您的来源,并为您的班级使用java/classes。由于类存储在classes文件夹中,因此应该在类路径中。

您的来源的文件夹树应该与您的包树匹配。这意味着类mew.Mouth必须包含行package mew,在Mouth.java文件中的java/src/mew文件夹中定义。

要编译您的类,请将您放入java/src目录,然后使用以下命令:

javac -d ../classes mew/Mouth.java pickle/Say.java

编译器将自动生成与classes目录中的包结构匹配的文件夹结构。如果在源代码树中进行结构修改,只需删除classes文件夹中的所有内容,然后重新编译所有内容。

要运行您的课程,您必须参考他们的完全限定名称。包含您的包树(java/classes文件夹)的文件夹必须位于类路径中。一旦完成,从任何地方,您都可以使用

java mew.Mouth

请注意,正如您所发现的,保留了javajavax个包。你不能将它们用于你自己的课程。

答案 1 :(得分:0)

请试试这个,

打开根文件夹,转到查看菜单&勾选,查看隐藏文件。现在它将显示一个名为“.bashrc”的文件。打开这个文件&写下以下代码行,

PATH=$PATH:/opt/jdk1.6.0_21/bin
export PATH
JAVA_HOME=/opt/jdk1.6.0_21
export JAVA_HOME