java程序添上包就不能运行了,为啥?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java程序添上包就不能运行了,为啥?相关的知识,希望对你有一定的参考价值。
package wo;
public class Helloworld1
public static void main(String[] args)
System.out.println("Hello world!");
能编译不能运行,怎么回事??
然后使用java wo/Helloword 解释运行。。
下面是我在网络上看到的一篇文章,感觉不错! 贴上来给你!
1,什么都别说,先跟着我来做一把
我们先找一个目录,比如C:\myjob
然后我们建立两个目录,一个叫做src,一个叫做bin
C:\myjob>md src
C:\myjob>md bin
C:\myjob>dir
驱动器 C 中的卷是 LIGHTNING
卷的序列号是 3DD1-83D9
C:\myjob 的目录
2005-12-25 14:33 <DIR> .
2005-12-25 14:33 <DIR> ..
2005-12-25 14:34 <DIR> src
2005-12-25 14:34 <DIR> bin
0 个文件 0 字节
4 个目录 305,123,328 可用字节
C:\myjob>
然后我们在src目录中去写程序
C:\myjob>cd src
C:\myjob\src>
我们写这么4个java文件
////A.java
package com.lightning;
public class A
System.out.println("com.lightning.A");
////B.java
package com.lightning;
public class B
System.out.println("com.lightning.B");
////C.java
package com;
public class C
System.out.println("com.C");
////Test.java
package net.test;
import com.lightning.*;
import com.*;
public class Test
public static void main(String[] args)
new A();new B();new C();
System.out.println("net.test.Test");
写好之后就是这样
C:\myjob\src>dir
驱动器 C 中的卷是 LIGHTNING
卷的序列号是 3DD1-83D9
C:\myjob\src 的目录
2005-12-25 14:34 <DIR> .
2005-12-25 14:34 <DIR> ..
2005-12-25 14:39 86 A.java
2005-12-25 14:40 86 B.java
2005-12-25 14:42 194 Test.java
2005-12-25 14:43 68 C.java
4 个文件 434 字节
2 个目录 305,106,944 可用字节
然后我们建立com目录,com\lightning\目录,net\test\目录
C:\myjob\src>md com
C:\myjob\src>md com\lightning
C:\myjob\src>md net\test\
我们将Test.java放入net\test\中去
将A.java,B.java放入com\lightning\中去
将C.java放入com\中去
C:\myjob\src>move Test.java net\test\
C:\myjob\src>move A.java com\lightning\
C:\myjob\src>move B.java com\lightning\
C:\myjob\src>move C.java com\
然后我们在c:\myjobs中发令:
C:\myjob\src>cd ..
C:\myjob>javac -sourcepath src -d bin src\net\test\Test.java
然后我们看看bin目录中多了什么
C:\myjob>dir bin /s
驱动器 C 中的卷是 LIGHTNING
卷的序列号是 3DD1-83D9
C:\myjob\bin 的目录
2005-12-25 14:34 <DIR> .
2005-12-25 14:34 <DIR> ..
2005-12-25 14:46 <DIR> net
2005-12-25 14:46 <DIR> com
0 个文件 0 字节
C:\myjob\bin\net 的目录
2005-12-25 14:46 <DIR> .
2005-12-25 14:46 <DIR> ..
2005-12-25 14:46 <DIR> test
0 个文件 0 字节
C:\myjob\bin\net\test 的目录
2005-12-25 14:46 <DIR> .
2005-12-25 14:46 <DIR> ..
2005-12-25 14:46 520 Test.class
1 个文件 520 字节
C:\myjob\bin\com 的目录
2005-12-25 14:46 <DIR> .
2005-12-25 14:46 <DIR> ..
2005-12-25 14:46 <DIR> lightning
2005-12-25 14:46 338 C.class
1 个文件 338 字节
C:\myjob\bin\com\lightning 的目录
2005-12-25 14:46 <DIR> .
2005-12-25 14:46 <DIR> ..
2005-12-25 14:46 354 A.class
2005-12-25 14:46 354 B.class
2 个文件 708 字节
所列文件总数:
4 个文件 1,566 字节
14 个目录 305,057,792 可用字节
然后我们执行,同样在c:\myjobs\下发令
C:\myjob>java -cp bin net.test.Test
com.lightning.A
com.lightning.B
com.C
net.test.Test
2,从实践到理论
刚才我用一个非常简单但是非常完整的例子给大家演示了java的package机制。
为什么以前脑海里面那么简单的javac会搞得这么复杂呢?
实际上它本就这么复杂,
并不是一个.java,一行javac一个当前目录中的class这么简单。
首先我要打破一些东西,然后才好建立一些东西。
javac并非只是给一个.java编译一个class的。javac自带有make机制,也就是说,如果在
javac的参数中java文件使用到的任何类,javac首先会去找寻这个类的class文件存在与否
,如果不存在,就会在sourcepath中找寻源代码文件来编译。
什么是sourcepath呢?sourcepath是javac的一个参数,如果你不加指定,那么sourcepath
就是classpath。
比如我们装好jdk之后,我说过不要设定classpath环境变量,因为大部分人一旦设定了
classpath,不是多此一举把什么dt.jar放进去。(我可以好好打击你一下,告诉你一个可
悲的事实——jre永远不会从你这个classpath中去寻找dt.jar。你完全是徒劳的!)就是
把"."搞不见了,搞得是冷水一盆盆的往自己身上泼,脑袋一点点的涨大。
不要设!classpath没有你想象中那么普适和强大,它只是命令行的简化替代品。
你不设的话它就是"."。
回到sourcepath,sourcepath指的是你源代码树的存放地点。
为什么是源代码树?而不是一个目录的平板源代码呢?
请大家将原本脑海中C的编译过程完全砸掉!
java完全不同,java没有头文件,每个.java都是要放在源代码树中的。
那么这颗树是怎么组织的呢?
对了,就是package语句。
比如写了package com.lightning;
那么这个.java就必须放在源代码树根\的com\lighting\之下才行。
很多浮躁的初学者被default打包方式宠坏了。自我为中心,以为java就是一套库,自己写
的时候最多import进来就行了,代码从不打包,直接javac,直接java,多么方便。
孰不知自己写的这个.java也不过是java大平台的其中一个小单元而已。如果不打包,
我写一个Point,你写一个Point,甚至更有甚者敢于给自己的类起名叫String等等。
全部都在平板式的目录中,那jre该选哪一个?
一旦要使用package语句,就要使用代码树结构,当然,你要直接javac,也行。
不过javac出来的这个class要放在符合package结构的目录中才能发挥正常作用,否则就是
废物一坨。
而且,如果你这个.java还用到其它自己写的有package语句的.java,那这个方法就回天乏
术了。
按照sun的想象,应该是写好的.java放在符合package结构的目录中,package语句保证了
正确放置,如果目录位置和package语句中指示的不同,则会出错。
所以按照刚才我们的那种package写法,我们必然要将那几个.java文件放入相应的目录中
才能让javac顺利找到他们来make。
有人说javac可不可以像java那样 java aaa.bbb.c...java?
不可以
javac中的那个.java文件参数必须是一个文件系统的路径文件名形式。
然后如果用到其它的.java,javac会根据目前的sourcepath出发寻找目录结构中的那些
java文件。
当然了,既然打了包,在使用的时候。
要么写全名——包名.类名
或者使用import
不得不提的是,import就好比c++的using,它不负责做文件操作,它只是方便你写代码。
另外import语句中的*代表的是类名,不代表包名片断。
你import com.*;
编译器仍然找不到com.lightning中的任何类。
反之亦然。
就好象你告诉编译器,我这里面要用到姓诸葛的人。
那么姓诸的人当然编译器不会认为也包含在内。
所以,如果程序一旦写到一定规模。
就不得不使用ant来管理这些。
或者使用IDE,否则jdk就真的变成了java developer killer。
但是对于初学者,在了解为什么会有ant之类的之前,还是要体会一下使用
jdk的艰辛。
这个和以前在unix上开发的人用gcc命令行到后来使用make之后使用ide
之类的时候的体会是类似的。
最后,javac的-d参数是指示编译出来的class文件放在哪里的,如果你不指定的话,它们
和.java混在一起。当然也符合目录结构。 参考技术A 这个是这样的啊,有两种解决办法
一:把包去掉,package wo; 这句不要
二:运行时候加上这个
java wo/Helloworld1
为什么会出现这样的原因呢?
因为打包的时候已经把.class文件打包到wo的文件夹下去了
而java命令执行的时候是在当前目录下找.class文件,如果找不到就会出错
所以。。。。。
呵呵
给你做个示范
C:\>javac -d . Helloworld1.java //打包
C:\>java Helloworld1
Exception in thread "main" java.lang.NoClassDefFoundError: Helloworld1 (wrong na
me: wo/Helloworld1)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Could not find the main class: Helloworld1. Program will exit.
成功后的是这样的:
C:\>java wo/Helloworld1
Hello world!
讲的不是很多,但原理就这样的哦
你可以仔细想想。。。本回答被提问者采纳 参考技术B 把.class文件放到wo文件夹地下,然后到wo的上一层,执行java wo.HelloWorld1 参考技术C 要加上包名才可以
类死java com.baidu.helloword
为啥我的jdk安装好了后,java程序能编译却不能运行啊?
编译是javac,运行是java,执行在cmd窗口分别输入这两个命令,如果提示命令的使用信息则表示环境变量配置正常,检查你执行时文件路径是否正确,是否执行的是class文件,如果提示命令不存在,则检查对应的环境变量配置,即classpath和path。 参考技术A 您好,非常荣幸能在此回答您的问题。以下是我对此问题的部分见解,若有错误,欢迎指出。你好!看看你的jdk有没有少包。非常感谢您的耐心观看,如有帮助请采纳,祝生活愉快!谢谢! 参考技术B 运行代码是不是有错误,或者自己敲代码敲错了几个字母或者少几个字母。你自己检查一下看看是不是, 参考技术C 你好,你可以测试一下自己的jdk环境变量有没有配置完成,如果不会可以自己上网百度 参考技术D 你这个问题太模糊了,如果有图片会比较明确一点,你是怎么判断不能运行的?报什么错误?以上是关于java程序添上包就不能运行了,为啥?的主要内容,如果未能解决你的问题,请参考以下文章
如果 java Hello World 程序在包中,为啥我不能运行它?
为啥我不能使用 Ubuntu 编译我的 Java 应用程序?