2011-10-05 64 views
0

这是跟进我的问题:困惑编译一个基本的Java测试程序和包

error in java basic test program

这仍是困惑我。 所以具体的问题是:

我已经有一个包和目录完成。 说com.learn.java.mypackage

$ pwd 
.../com/learn/java/mypackage 

,在这里我要创建在同一封装测试程序并执行它。

$cat TestPackage.java 

package com.learn.java.mypackage; 

public class TestPackage 
{ 

public static void main(String args[]) 
{ 
System.out.println("Hello World\n"); 
} 
} 

$ javac TestPackage.java 
// runs file 

$ Java TestPackage 


Exception in thread "main" java.lang.NoClassDefFoundError: TestPackage (wrong name: com/learn/java/TestPackage) 

如果Java运行时要确保属于一个包中的文件住在同一个命名的目录,这是真的在这里。那么为什么它仍然是婴儿床?

+0

你试过'java com.learn.java.mypackage.TestPackage'吗? –

+0

我对这个问题感到困惑,特别是它与以前的不一样。 –

+0

这里我在那个目录里面,以防它有什么区别.. – xyz

回答

1

您应该从com的父文件夹中执行java com.learn.java.mypackage.TestPackage

所以,如果com的完整路径是/my/project/folder/com/...你应该叫java com.learn.java.mypackage.TestPackage/my/project/folder

从聊天中粘贴:

您可以从任何地方java -cp /my/project/folder a.b.c.ClassName,它告诉java查找中发现的类ClassName使用/my/project/folder

+0

这工作。谢谢。如果我想独立于当前位置运行我的课程,该命令的外观如何? – xyz

+0

使用java -cp/my/project /文件夹com.learn.java.mypackage.TestPackage,其中/ my/project /文件夹是com的父级 – Matyas

+0

所以这是令人困惑的。对于TestPackage,我们应该给出整个包名..它不是说类文件将自己的包信息嵌入到自身中。当我想运行类时,我只是给出类名称,并从类路径中获取由包路径前缀的类。??在这种方法中似乎有一些冗余..一些描述/指针背后的原因应该是有用的.. – xyz

0

添加.到classpath,并使用完全限定域名(含包装)

java命令。 com.learn.java.mypackage.TestPackage

+0

-1当前目录是默认的类路径,这也是错误的原因。 –

1

编译可以在java文件所在的目录中正常工作。
然而,对于运行Java程序,你需要去的目录所在的包开始,并提供给命令

转到目录当中有您com文件夹的全包的信息包,然后用

java com.learn.java.mypackage.TestPackage 
+0

这有效。如何让java运行独立于当前路径。并避免必须在包的开始路径 – xyz

+0

如果您希望它独立于路径,则需要添加目录(在com文件夹所在)到类路径。类文件可以遍历,但仍然需要完整的包路径来执行。 – Jayendra

0

的解释是this Java tutorial提供:包装a.b.c和包应该在其路径搜索:

类目录\ classes的完整路径称为类路径,并使用CLASSPATH系统变量进行设置。编译器和JVM都通过将包名添加到类路径来构建.class文件的路径。例如,如果

<path_two>\classes 

是你的类路径和包名是

com.example.graphics, 那么编译器和JVM查找.class文件中

<path_two>\classes\com\example\graphics. 

类路径可能包含多个路径,用分号(Windows)或冒号(Unix)分隔。默认情况下,编译器和JVM搜索当前目录和包含Java平台类的JAR文件,以便这些目录自动位于类路径中。

0

您对编译这样的标志 “-d” 文件:

的javac -d。 TestPackage.java java TestPackage.java

试试!