2017-07-25 56 views
0

我一直在学习类路径和跨问题就来了。 我用下面的代码:如何设置环境变量CLASSPATH和对NoClassDefFoundError的LINUX

class AAA 
{ 
    public AAA() 
    { 
     System.out.println("AAA"); 
    } 
} 
class BBB 
{ 
    public BBB() 
    { 
     System.out.println("BBB"); 
    } 
} 
class ABMain 
{ 
    public static void main(String[] args) 
    { 
     AAA aaa=new AAA(); 
     BBB bbb=new BBB(); 
    } 
} 

在终端,我确实:

  1. 的javac ABMain.java
  2. MKDIR子
  3. 集CLASSPATH =:\子;
  4. 移动的aaa.class。\子\
  5. 的aaa.class
  6. 移动BBB.class。\子\ BBB.class
  7. 的Java ABMain

当我检查了子目录,我发现,AAA的.class和BBB.class被正确地移动,但是当我尝试运行ABMain,我得到如下:

Exception in thread "main" java.lang.NoClassDefFoundError: AAA at ABMain.main(ABMain.java:17) Caused by: java.lang.ClassNotFoundException: AAA at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 1 more

你能否帮我应该改变,使其工作有何评论?先谢谢你。

+0

[层次结构中的一组类路径其他目录(的可能的复制https://stackoverflow.com/questions/5017106/ set-classpath-other-directory-in-the-hierarchy) – JFPicard

回答

0

根据标题,您使用LINUX。但是你的步骤是针对Windows生态系统的。 要解决的例子,你应该使用直接斜杠作为路径分隔符,并添加当前目录作为CLASSPATH替代(能够加载主类以及):

  1. javac ABMain.java
  2. mv AAA.class ./sub/AAA.class
  3. mv BBB.class ./sub/BBB.class
  4. java -cp ./sub:. ABMain
+0

我用你提供的命令,它工作得很好!第4步,请你解释一下命令(我不完全了解-cp ./sub :.)?谢谢。 –

+0

-cp标志指定特定java启动的CLASSPATH,而不是全局设置它。 在linux下你全局设置CLASSPATH变量如下: 出口CLASSPATH = /一些/路径/之一:/一些/路径/二:/一些/路径/三相 这里是一样的 - 你设置两个pathes。和./sub – Zarxonius

0

需要导入子的包ABMain之前类,因为怎么你ABMain将能够知道AAA和BBB

的位置,我会建议AAA级和BBB级

包之前使用子;

和由ABMain类

进口子之前写以下代码导入包*。

+0

我希望文件在没有导入包的情况下运行,因为我在完成编写代码后移动了AAA.class和BBB.class。 –