命令行下JDK自带编译javac和执行java,以及环境变量的原理总结

1 篇文章 0 订阅
1 篇文章 0 订阅
1.设置当前命令行下的CLASSPATH
  - set classpath=c:/packageA/packageB/......
  - set classpath=.;c:/package1/package2/......;%classpath%
 
2.编译带有包名的类
  Definition: A package is a collection of related classes and interfaces
  that provides access protection and namespace management.
    (一个包就是一些提供访问保护和命名空间管理的相关类与接口的集合.
    使用包的目的就是使类容易查找使用, 防止命名冲突, 以及控制访问.)
    
  此种情况分为两种,一种是通过javac来自动提供命名空间管理和访问保护,另一种是用户自定义(此种情况下,用户会自己控制访问保护和命名空间管理)
 
  ◆通过javac来自动提供命名空间管理和访问保护
            此时javac在编译源文件的时候需要指定编译文件所放置的目录,即使是当前目录。如:javac -d . HelloWorld.java
        那么在此种情况下,javac会在编译的时候扫描源文件中的package命名空间,如果是默认包default,就直接编译,并将编译生成的字节码文件HelloWorld.class放置在当前目录下,
        如果指定package,如:com.service,那么javac会先unpackage解包,在指定的目录下(目前是当前目录 . )生成相应的package包中的目录,如:./com/service,并将编译生成的字节码文件HelloWorld.class放置在
        unpackage的包中。
  ◆用户自定义(不指定编译完成的字节码文件的放置位置,javac默认编译完成后放置在与源文件相同的目录)
            新建与源文件中package包名相同的文件夹目录,如E:/com/service,类文件必须在与package包名相同的目录结构下,如E:/com/service/HelloWorld.java
     
          a.切换到类在的文件加下,如cd E:/com/service
            E:\>javac HelloWorld.java
          b.切换到类所在的文件目录结构中的任何上层目录(包括根盘符目录),如cd E:/com
            E:\com>javac service/HelloWorld.java
        
(★在自定义使用javac默认编译完成后将字节码文件放置在与源文件相同的目录,而不重新指定编译文件放置目录的情况下,和通过avac来自动提供命名空间管理和访问保护指定字节码文件所放置的目录的情况下,编译的字节码文件完全相同)
      
3.执行class文件
  - 没有package包名的情况
      只要CLASSPATH环境变量中指定有class文件执行时需要查找的的class文件所在jar文件/目录,如:set classpath=e:/com/service,在class文件所在目录或其他任何上级目录都可以执行
      这会带来问题:
        a.如在设置CLASSPATH时,如set classpath=.;e:/com/service;%classpath%,
          如果在包含进来的%classpath%中如果有同名的HelloWorld.java时,并且该类也使用默认包名,即不设置包名,那么,在包含进来的%classpath%中靠后的同名HelloWorld永远不会被执行,
          这是由于CLASSPATH的加载顺序决定的,CLASSPATH会先顺序加载系统环境变量,然后顺序加载用户环境变量,那么在此例中,被加载的e:/com/service中的同名不带包名的HelloWorld会覆盖
          在靠后的%classpath%中指定的同名不带包名的HelloWorld。所以Java建议使用带包名的类。
          
  - 带有package包名的情况
      与没有包名的类完全不同。带有包名的类在执行时必须带有包名,即java在执行时,必须是带有完全限定名的类,如com.service.HelloWorld,而且必须在paceage包名的根目录,如E:/
      并且必须设置CLASSPATH的查找路径包括package包名的根目录或当前路径(即:.),如set classpath=.;c:/package1/package2/......;%classpath%
      这样在执行HelloWorld时会从package包名的根目录或当前路径(即:.)开始查找完全限定名的class文件。
      此时Java会自动unpackage,并从classpath中设置的路径开始按unpackage之后的目录结构在相应的目录下查找class文件,最后执行。在JVM内存中维护符合namesapce management规范的相应完全限定名下的class文件
      在调用时,必须从package包名的根目录去执行符合namesapce management规范的带完全限定名的class文件,
      因为它会从完全限定名unpackage之后目录结构的根目录下去按照unpackage后的结构逐级匹配查找在本地/服务器的class文件,定位到之后,通过ClassLoader加载到JVM然后运行,如果运行期异常,则会报错
      如果没有定位到在本地/服务器的class文件,则JVM会抛:找不到或无法加载主类

        E:\>java com.service.HelloWorld
            hello world!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值