关于Java';Linux上的类路径设置

关于Java';Linux上的类路径设置,java,openjdk,Java,Openjdk,各位 我在ArchLinux上使用了openjdk-7。我最近开始学习Java,遇到了这样一个问题: 我在/home/hqError/Code/java/mew/Mouth.java创建了一个文件: package mew; public class Mouth{ public static void main(String argv[]){ pickle.Say s = new pickle.Say(); } } 还有一个在/home/hqerror/Code/ja

各位

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

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

package mew;

public class Mouth{
   public static void main(String argv[]){
       pickle.Say s = new pickle.Say();
  }
}
还有一个在/home/hqerror/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
没有错误消息

但在我打字之后:

$javasay

我得到:

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
我需要你的帮助,请?

请试试这个

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

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

既然还没有好的答案,我就发我的

首先,你应该为你的类和你的源有一个单独的文件夹。我建议对源代码使用
java/src
,对类使用
java/classes
。由于类存储在classes文件夹中,因此这是应该位于classpath中的类

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

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

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

要运行类,必须引用它们的完全限定名。并且包含包树的文件夹(
java/classes
文件夹)必须位于类路径中。一旦完成此操作,您就可以在任何地方使用

java mew.Mouth

注意,正如您所发现的,
java
javax
包是保留的。您不能在自己的类中使用它们。

您是按原样显示代码还是为此问题修改了代码?我怀疑你的代码中可能有“package java.mew”?@anubhava它的初始值是零,我不知道它为什么编译成功,直到我做了这个包测试,也许它通过其他方式知道jdk系统库路径。@laixer是的,它是原始的。我在学习java,这是我学习java包功能的代码。在修改为包java.mew之后,它也失败了。对不起,这很好。代码中不应该有“package java.something”。“包喵”或“包泡菜”是可以吃的。我只是在检查问题中是否有错误。谢谢你的回答。但我想答案是我键入了一个错误的类名,正如MockerTim所说。没关系,这是针对类路径设置的,正如你的问题标题所描述的。你能不能至少说出我的答案,以便对其他人有用?这个答案对我也有帮助。非常感谢^