当编译源文件时,编译器常常需要识别出类型的有关信息。对于源文件中使用、扩展或实现的每个类或接口,编译器都需要其类型信息。这包括在源文件中没有明确提及、但通过继承提供信息的类和接口。

例如,当扩展 java.applet.Applet 时还要用到 Applet 的祖先类:java.awt.Panel 、 java.awt.Container、 java.awt.Component 和 java.awt.Object。

当编译器需要类型信息时,它将查找定义类型的源文件或类文件。编译器先在自举类及扩展类中查找,然后在用户类路径中查找。

属于Java 平台核心的class,比如java.lang.String等以及rt.jar等重要的核心级别的class。这是由Bootstrap ClassLoader来载入的。一般是放置在{java_home}\jre\lib目录下。

A、BootStrap class扩展方案

(1)-Xbootclasspath: 分隔目录和zip/jar文件。设置搜索路径以引导类和资源。分隔符unix使用:号,windows使用;

注意,如果用这个参数,不用下面的/a或者/p的话,就只会从这里指定的目录和文件里加载了,就不会到{java_home}\jre\lib下加载核心类库了

(2)-Xbootclasspath/a: 后缀在核心class搜索路径后面,常用。unix使用:号,windows使用来分隔目录和zip/jar文件
(3)-Xbootclasspath/p: 前缀在核心class搜索路径前面.不常用。

如:

System.getProperty("sun.boot.class.path")

输出如下: 

C:\Program Files\Java\jdk1.7.0_75\jre\lib\resources.jar;
C:\Program Files\Java\jdk1.7.0_75\jre\lib\rt.jar;
C:\Program Files\Java\jdk1.7.0_75\jre\lib\sunrsasign.jar;
C:\Program Files\Java\jdk1.7.0_75\jre\lib\jsse.jar;
C:\Program Files\Java\jdk1.7.0_75\jre\lib\jce.jar;
C:\Program Files\Java\jdk1.7.0_75\jre\lib\charsets.jar;
C:\Program Files\Java\jdk1.7.0_75\jre\lib\jfr.jar;
C:\Program Files\Java\jdk1.7.0_75\jre\classes

B、Extension class 扩展方案

Java extend class 存放在{Java_home}\jre\lib\ext目录下。当调用Java时,对扩展class路径的搜索是自动的,总会搜索的。

其ext目录下的jar如下:

C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\access-bridge-64.jar
C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\dnsns.jar
C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\jaccess.jar
C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\localedata.jar
C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunec.jar
C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunjce_provider.jar
C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunmscapi.jar
C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\zipfs.jar

(1)-Djava.ext.dirs= 覆盖Java本身的ext设置。-D 是设置系统的属性

java.ext.dirs指定的目录由Extension ClassLoader加载器加载。如果程序没有指定该系统属性,那么该加载器默认加载$JAVA_HOME/jre/lib/ext目录下的所有jar文件。但如果指定系统属性且忘了把$JAVA_HOME/jre/lib/ext路径给加上,那么Extension ClassLoader不会去加载$JAVA_HOME/lib/ext下面的jar文件,这意味着将失去一些功能,例如java自带的加解密算法实现。

(2)-endorseddirs

(3)-Djava.endorsed.dirs= 包升级替换机制
-Djava.endorsed.dirs指定的目录里面放置的jar文件,将有覆盖系统API的功能。但是能够覆盖的类是有限制的,其中不包括java.lang包中的类。
比如Java的原生api不能满足需求,需要修改ArrayList类,包和类名和java自带的都是一样并且必须满足JDK规范,如实现List接口等,打包成一个jar包(不是.java或者.class),放入到-Djava.endorsed.dirs=指定的目录中,这样就可以使用自定义的ArrayList类了。根据官方文档描述:如果不想添加-D参数,如果我们希望基于这个JDK下都统一改变,那么可以将修改的jar放到$JAVA_HOME/jre/lib/endorsed(非$JAVA_HOME/jdk/lib/endorsed),

这样基于这个JDK的所有的ArrayList都改变了!!!

例如:

String s = System.getProperty("java.endorsed.dirs");
System.out.println(s); // C:\Program Files\Java\jdk1.7.0_75\jre\lib\endorsed

C、Application class扩展方案

通过两种途径来定义:通过设置 CLASSPATH 环境变量或使用 -classpath 命令行选项。JVM通过放置在{java_home}\lib\tools.jar来寻找和调用用户级的class。

-classpath 类路径设置用户类路径,它将覆盖 CLASSPATH 环境变量中的用户类路径。若既未指定 CLASSPATH 又未指定 -classpath,则用户类路径由当前目录构成。

查看缺省的用户类路径,如:

String defaultUserDir = System.getProperty("user.dir");
System.out.println(defaultUserDir);

D、User class扩展方案

若未指定 -sourcepath 选项,则将在用户类路径中查找类文件和源文件。编译的过程中,若需要相关java类的则首先在sourcefiles或@files列出的java源码文件中查找并编译,如果没找到,就在-sourcepath指定的路径中查找java源码文件

-cp(classpath) 与 -sourcepath 的区别与联系:

1、当 -sourcepath 没有指定时,在 -cp 路径里面搜索 .class 和 .java 文件 
2、当 -sourcepath 指定时,只搜索 -cp 路径下的 .class 文件,即使-cp 路径下有要找的.java文件也会不搜索这个文件 
3、 -sourcepath 只搜索 .java 文件,不搜索 .class 文件。因此应该避免用 -sourcepath,而只用 -cp 来指定搜索 .class 和 .java 文件的路径  
如C:\examples>javac x/a.java -cp y 表示编译C:\examples\a.java。如果 a.java 里面有未知的符号b,那么从C:\examples\y\ 路径下的 .class 或 .java 文件里面搜索 
 
注意:无论是-classpath还是-sourcepath,只指定到类的package的上一级,如某个类在包com.test下,则只需要指定到com的上一级

成功的类型搜索可能生成类文件、源文件或两者兼有。以下是 javac 对各种情形所进行的处理:

  • 搜索结果只生成类文件而没有源文件: javac 使用类文件。
  • 搜索结果只生成源文件而没有类文件: javac 编译源文件并使用由此生成的类文件。
  • 搜索结果既生成源文件又生成类文件: 确定类文件是否过时。若类文件已过时,则 javac 重新编译源文件并使用更新后的类文件。否则, javac 直接使用类文件。

    缺省情况下,只要类文件比源文件旧, javac 就认为它已过时。( -Xdepend 选项指定相对来说较慢但却比较可靠的过程。)

@符号的使用

将要编译的原文件列入一个文本文件中,如src.txt文件,内容如下:

src\com\robin\Hello.java src\com\robin\People.java
src\com\hubin\Util.java 

然后使用命令:javac -d classes @src.txt 进行编译。

sourcefile命令的使用

如果命令为:javac  sourcefilepath

那么后面的sourcefilepath即代表了sourcefile命令。

可以参考的文章:

(1)http://www.tuicool.com/articles/FZNNNb

(2)https://www.cnblogs.com/wangpei/p/7084341.html

javac的命令(-Xbootclasspath、-classpath与-sourcepath等)的更多相关文章

  1. java-关于java_home配置,classpath配置和javac,java命令,javac编译器,和java虚拟机之间的关系

    在每个人学习java的第一步,都是安装jdk ,jre,配置java_home,classpath,path. 为什么要做这些?在阅读java-core的时候,看到了原理,p141. 一 关于类的共享 ...

  2. Javac的命令

    关于命令,还可以查看<Java 7程序设计>一书后面的附录A As per javac source docs, there are 4 kinds of options: standar ...

  3. Javac的命令(-Xlint)

    在OptionName类中的枚举定义如下: XLINT("-Xlint"), XLINT_CUSTOM("-Xlint:"), -Xlint     Enabl ...

  4. Javac的命令(注解相关)

    1.-Akey[=value] Options to pass to annotation processors. These are not interpreted by javac directl ...

  5. 将Java和Javac的命令在控制台的输出重定向到txt文件

    当我们在Windows控制台窗口执行程序时,输入如下命令: demo.exe > out.txt 就可以把demo程序的输出重定向到out.txt文件里面. 但是这种方法对于java和javac ...

  6. javac编译多个java文件以及-cp、-classp、-sourcepath

    //编译多个文件 javac  path_of_file_a/a.java path_of_file_b/b.java path_of_file_c/c.java   -cp(classpath) 与 ...

  7. JAVA和JAVAC 命令行

    转自:http://www.blogjava.net/pdw2009/archive/2008/06/12/207413.html?opt=admin javac和java命令行中的-classpat ...

  8. javac不是内部或外部命令在win10上的解决方案

    Path环境变量能够让你在任何路径都能使用命令,可能你百度谷歌了各种方案都无法解决javac无法使用的问题,那么你可以试试如下解决方案: 首先博主配置了JAVA_HOME 参数为 C:\Program ...

  9. 在CMD窗口中使用javac和java命令进行编译和执行带有包名的具有继承关系的类

    一.背景 最近在使用记事本编写带有包名并且有继承关系的java代码并运行时发现出现了很多错误,经过努力一一被解决,今天我们来看一下会遇见哪些问题,并给出解决办法. 二.测试过程 1.父类代码 pack ...

随机推荐

  1. ZOJ 3702 Gibonacci number 2017-04-06 23:28 28人阅读 评论(0) 收藏

    Gibonacci number Time Limit: 2 Seconds      Memory Limit: 65536 KB In mathematical terms, the normal ...

  2. ASP.NET Core2实现静默获取微信公众号的用户OpenId

    最近在做个微信公众号的项目,需要将入口放置在公众号二级菜单内,通过点击该菜单链接后进入到该项目中去,进入到项目后程序会自动通过微信公众号的API完成用户的OpenId获取.需求很简单,实现起来也不复杂 ...

  3. Python学习-13.Python的输入输出(二)

    在Python中,读取文件使用open函数 file=open(r'E:\temp\test.txt','r') var = file.read() print(var) file.close() 第 ...

  4. [转载]利用近场探头和频谱仪查找EMI辐射问题

    原文链接 http://www.pesmatrix.com/news/html/?412.html 电磁兼容性(Electromagnetic Compatibility,简称EMC)是指设备或系统在 ...

  5. scvmm sdk之ddtkh(二)

    ddtkh,dynamic datacenter toolkit for hosters,原先发布在codeplex开源社区,后来被微软归档到开发者社区中,从本质上来说它是一个企业级应用的套件,集成了 ...

  6. Java异常:选择Checked Exception还是Unchecked Exception?

    http://blog.csdn.net/kingzone_2008/article/details/8535287 Java包含两种异常:checked异常和unchecked异常.C#只有unch ...

  7. ES6——内置对象的扩展

    字符串的扩展 //模版字符串 let flag=true; let hml=`<ul> <li> <span></span> <span>& ...

  8. uploadPreview 上传图片前预览 IE9 索引无效的问题

    最近公司的项目用到比较多的上传图片的操作,所以用到了基于jquery的上传前预览的插件 uploadPreview ,后来测试的时候发现在IE9下报索引无效的问题. 异常的产生方式 放一个file控件 ...

  9. HTML防止input回车提交表单

    原链接:https://blog.csdn.net/ligang2585116/article/details/44699567 自动提交情况说明: 1.默认情况下,单个输入框,无论按钮的type=& ...

  10. “全栈2019”Java异常第五章:一定会被执行的finally代码块

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...