当前位置: 技术问答>java相关
刚学包遇到个问题,请指教
来源: 互联网 发布时间:2015-07-29
本文导语: 源程序A.java package mypack; public class A{ public void ml(){ System.out.println("hi"); } } 源程序Test.java package mytestpack; import mypack.A; public class Test{ public static void main(String[] args){ A hello=new A(); hello.ml(); } } 编译后没问...
源程序A.java
package mypack;
public class A{
public void ml(){
System.out.println("hi");
}
}
源程序Test.java
package mytestpack;
import mypack.A;
public class Test{
public static void main(String[] args){
A hello=new A();
hello.ml();
}
}
编译后没问题
就是若输入D:mytestpackjava Test得到
java.lang.NoClassDefFoundError: Test (wrong name: mytestpack/Test)
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:486)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:111)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:248)
at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:297)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:286)
at java.lang.ClassLoader.loadClass(ClassLoader.java:253)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:313)
Exception in thread "main" Normal Termination
若输入D:java mytestpack.Test就没错了
这是为什么?
package mypack;
public class A{
public void ml(){
System.out.println("hi");
}
}
源程序Test.java
package mytestpack;
import mypack.A;
public class Test{
public static void main(String[] args){
A hello=new A();
hello.ml();
}
}
编译后没问题
就是若输入D:mytestpackjava Test得到
java.lang.NoClassDefFoundError: Test (wrong name: mytestpack/Test)
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:486)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:111)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:248)
at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:297)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:286)
at java.lang.ClassLoader.loadClass(ClassLoader.java:253)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:313)
Exception in thread "main" Normal Termination
若输入D:java mytestpack.Test就没错了
这是为什么?
|
其实你编译完两个文件之后,你会在D:发现两个文件夹mypack和mytestpack.当你在mytestpack文件夹中执行命令时,他会在当前目录下搜寻mypack文件夹,当然就找不到了.
------------------------
根据你的例子,你把D:作为你的java程序存放点.在设置classpath时你是设置的"."--当前目录.再加上"D:"试试.
------------------------
根据你的例子,你把D:作为你的java程序存放点.在设置classpath时你是设置的"."--当前目录.再加上"D:"试试.
|
带包的编译就是这样的。
javac -d 包的父目录 文件名.java
java 包的父目录.文件名
javac -d 包的父目录 文件名.java
java 包的父目录.文件名
|
每次创建一个包后,都在为包取名时间接地指定了一个目录结构。这个包必须存在(驻留)于由它的名字规定的目录内。而且这个目录必须能从CLASSPATH开始搜索并发现。最开始的时候,package关键字的运用可能会令人迷惑,因为除非坚持遵守根据目录路径指定包名的规则,否则就会在运行期获得大量莫名其妙的消息,指出找不到一个特定的类——即使那个类明明就在相同的目录中。若得到象这样的一条消息,请试着将package语句作为注释标记出去。如果这样做行得通,就可知道问题到底出在哪儿。
|
d:java mytestpack.Test
|
如果你用的是win2000,设置classpath可以在控制面板->系统->高级->环境变量里.