我的Java开发学习之旅------>在Dos环境下Java内部类的编译和运行

来源:互联网 发布:ubuntu vi 强制保存 编辑:程序博客网 时间:2024/05/20 10:11

习惯了在IDE工具上进行代码编写,连最基本的Javac命令和Java命令都忘记的差不多了,今天对一个Java内部类进行编译和运行的时候,就出糗了。IDE是把双刃剑,它可以什么都帮你做了,你只要敲几行代码,点几下鼠标,程序就跑起来了,用起来相当方便。你不用去关心它后面做了些什么,执行了哪些命令,基于什么原理。然而也是这种过分的依赖往往让人散失了最基本的技能,当到了一个没有IDE的地方,你便觉得无从下手,给你个代码都不知道怎么去跑。

  


首先我在C盘上编写了一个InnerClassTest.java代码,代码内容如下:

package com.csdn.oyp.inner;public class InnerClassTest {static class One{private static class Two{public static void main(String[] args) {System.out.println("two");}}}}

然后我在Dos窗口下使用命令进行编译

C:\Users\Administrator>cd C:\C:\>javac InnerClassTest.javaC:\>java InnerClassTest$One$TwoException in thread "main" java.lang.NoClassDefFoundError: InnerClassTest$One$Two (wrong name: com/csdn/oyp/inner/InnerClassTest$One$Two)        at java.lang.ClassLoader.defineClass1(Native Method)        at java.lang.ClassLoader.defineClass(ClassLoader.java:621)        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)        at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)        at java.net.URLClassLoader.access$000(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:307)        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)        at java.lang.ClassLoader.loadClass(ClassLoader.java:252)        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)Could not find the main class: InnerClassTest$One$Two.  Program will exit.


当运行完 javac InnerClassTest.java 命令后,在C盘生成了以下三个class文件,分别是:InnerClassTest$One$Two.class 

InnerClassTest$One.class

  InnerClassTest.class


但是运行 java InnerClassTest$One$Two命令时,却报了异常:Exception in thread "main" java.lang.NoClassDefFoundError: InnerClassTest$One$Two (wrong name: com/csdn/oyp/inner/InnerClassTest$One$Two)。

原来是因为我的InnerClassTest.java中有package语句:package com.csdn.oyp.inner;所以在进行编译的时候javac命令要加上-d选项。

把javac命令改为 C:\>javac -d . InnerClassTest.java  (注意 "."号)


javac -d destdir srcFile 命令解释

其中:1、-d destdir是用来指定存放编译生成的.class文件的路径。(若此选项省略,那么默认在当前目录下生成.class文件,并且没有生成包文件夹;当前目录可以用“.”来表示,即:javac -d . srcFile )

注意:添加-d选项除了可以指定编译生成的.class文件的路径外,最大的区别是可以将源文件首行的package关键字下的包名在当前路径下生成文件夹。


那么在当前目录(C盘)下生成一个C:\com\csdn\oyp\inner目录,用于保存编译好的class文件。如下图所示:


然后使用java命令运行main方法。

java com.csdn.oyp.inner.InnerClassTest$One$Two

运行结果为:输出two。


当然如果将InnerClassTest.java中的package语句删除,即不打包的话。

public class InnerClassTest {static class One{private static class Two{public static void main(String[] args) {System.out.println("two");}}}}
编译和运行代码为:

C:\>javac InnerClassTest.javaC:\>java InnerClassTest$One$Twotwo
如下图所示:


总结:如果编译Java文件时不是用 -d 选项,编译器不会为Java源文件生成相应的文件结构。鉴于此,笔者推荐编译Java文件时总是使用 -d 选项,即使想把生成的class文件放在当前路径下,也应该使用  -d .  选项,而不省略 -d 选项

=================================================================

C:\>javac -help用法:javac <选项> <源文件>其中,可能的选项包括:  -g                         生成所有调试信息  -g:none                    不生成任何调试信息  -g:{lines,vars,source}     只生成某些调试信息  -nowarn                    不生成任何警告  -verbose                   输出有关编译器正在执行的操作的消息  -deprecation               输出使用已过时的 API 的源位置  -classpath <路径>            指定查找用户类文件和注释处理程序的位置  -cp <路径>                   指定查找用户类文件和注释处理程序的位置  -sourcepath <路径>           指定查找输入源文件的位置  -bootclasspath <路径>        覆盖引导类文件的位置  -extdirs <目录>              覆盖安装的扩展目录的位置  -endorseddirs <目录>         覆盖签名的标准路径的位置  -proc:{none,only}          控制是否执行注释处理和/或编译。  -processor <class1>[,<class2>,<class3>...]要运行的注释处理程序的名称;绕过默认的搜索进程  -processorpath <路径>        指定查找注释处理程序的位置  -d <目录>                    指定存放生成的类文件的位置  -s <目录>                    指定存放生成的源文件的位置  -implicit:{none,class}     指定是否为隐式引用文件生成类文件  -encoding <编码>             指定源文件使用的字符编码  -source <版本>               提供与指定版本的源兼容性  -target <版本>               生成特定 VM 版本的类文件  -version                   版本信息  -help                      输出标准选项的提要  -Akey[=value]              传递给注释处理程序的选项  -X                         输出非标准选项的提要  -J<标志>                     直接将 <标志> 传递给运行时系统


C:\>java -helpUsage: java [-options] class [args...]           (to execute a class)   or  java [-options] -jar jarfile [args...]           (to execute a jar file)where options include:    -client       to select the "client" VM    -server       to select the "server" VM    -hotspot      is a synonym for the "client" VM  [deprecated]                  The default VM is client.    -cp <class search path of directories and zip/jar files>    -classpath <class search path of directories and zip/jar files>                  A ; separated list of directories, JAR archives,                  and ZIP archives to search for class files.    -D<name>=<value>                  set a system property    -verbose[:class|gc|jni]                  enable verbose output    -version      print product version and exit    -version:<value>                  require the specified version to run    -showversion  print product version and continue    -jre-restrict-search | -jre-no-restrict-search                  include/exclude user private JREs in the version search    -? -help      print this help message    -X            print help on non-standard options    -ea[:<packagename>...|:<classname>]    -enableassertions[:<packagename>...|:<classname>]                  enable assertions    -da[:<packagename>...|:<classname>]    -disableassertions[:<packagename>...|:<classname>]                  disable assertions    -esa | -enablesystemassertions                  enable system assertions    -dsa | -disablesystemassertions                  disable system assertions    -agentlib:<libname>[=<options>]                  load native agent library <libname>, e.g. -agentlib:hprof                    see also, -agentlib:jdwp=help and -agentlib:hprof=help    -agentpath:<pathname>[=<options>]                  load native agent library by full pathname    -javaagent:<jarpath>[=<options>]                  load Java programming language agent, see java.lang.instrument    -splash:<imagepath>                  show splash screen with specified image


可以参考以下链接:

http://www.cnblogs.com/xiazdong/p/3216220.html?utm_source=tuicool

==================================================================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址:http://blog.csdn.net/ouyang_peng

==================================================================================================



1 1
原创粉丝点击