`
hujiantao224
  • 浏览: 124715 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java 编译路径以及运行路径

阅读更多
Java中的类路径分“编译后的存放路径” 和 “运行时的查找路径”,下面分别谈谈
1. java编译后的类存放路径,
分两种:“源文件被直接编译”和“源文件被间接编译”
  1-1源文件直接编译
  什么是源文件直接编译:即通过javac直接编译源文件
建立d:\my目录,在其目录下新建一个文件,如下:
Public class HelloWorld{
  Public static void main(String[] args){
  System.out.println(“HelloWorld”);
  }
}
在命令行输入: javac HelloWorld.java
这时在d:\my这个目录下就产生了一个类文件HelloWorld.class
在命令行输入: java HelloWorld
HelloWorld

正常输出
改变一:
把原文件中的输出内容改为”changeHelloWorld”
重新编译,运行,可以看到在控制台输出了
changeHelloWorld

改变二:
恢复一的改变,并删除之前生成的类文件, 在源文件中的头部加入
Package com.test;

然后在命令行输入: javac –d . HelloWorld.java
这时在d:\my这个目录下就产生了一个新的目录com\test,类文件HelloWorld.class就位于test下 
注,如果不指明路径,则javac只会把生成的类文件放在默认包中,如同没包

改变三:
删除改变二中所产生的目录结构与类
然后在命令行输入: javac –d d:\ HelloWorld.java
这时在d:\ 这个根目录下就产生了一个新的目录com\test,类文件HelloWorld.class就位于test下

总结:对于源文件被直接编译的,其规则如下:
1. 每一次执行javac命令都会重新编译源文件,
2. 编译后的类文件的存放地址可以指定
3. 源文件带package结构的,编译时系统直接产生类文件存放的目录结构(针对package所指定,注意一定要明确指定编译后的路径喔)


  1-2源文件间接编译
  什么是源文件间接编译:放在A类中的B类,当A.java通过javac编译时,B也会被编译

建立d:\my1目录,在其目录下新建两个文件,如下:
A. java
public class A{
  public static void main(String[] args){
  B b1 = new B();
  b1.print();
  }
}

B. java
public class B{
  public void print(){
  System.out.println("package test");
  }
}

接着在命令行输入 javac A.java
这时在d:\my1这个目录下就产生了两个类文件A.class与B.class
  执行java A
  Package test

改变一:
  删除以上所产生的类文件,修改两个文件的源代码,分别在头部加上import edu.nctu.*;和package edu.nctu;即
A. java
import edu.nctu.*;
public class A{
  public static void main(String[] args){
  B b1 = new B();
  b1.print();
  }
}

B. java
package edu.nctu;
public class B{
  public void print(){
  System.out.println("package test");
  }
}

在命令行输入:
Javac A.java
接着会出现一些错误提示,主要提示如下:
A. java:1:package edu.nctu does not exist

解决方式:把d:\my1目录下的B.java移到d:\my1\edu\nctu\下就可以了

注意: 如果d:\my1下仍然存在B.java则还会报错,因为编译器总是先到A.java本身所在的路径中寻找B.java,虽然编译器找到了B.java,可是对比其package声明之后,认为它应为位于edu\nctu目录下,不该在此目录,因此产生错误信息

结论,对于间接被编译的.java文件,遵从如下规则
1. 该间接文件没有包的,则被直接编译,生成的类文件存放地址和原文件相同
2. 带包的间接文件,要想正确编译,必须明确手动建立包目录结构并且把间接文件置于其内
3. 。。。

2. 运行时的查找路径
  java 是通过 java虚拟机来解释运行的, 也就是通过 java 命令。 javac 编译生成的 .class文件就是虚拟机要执行的代码, 称之为字节码(bytecode), 虚拟机通过 classloader来装载这些字节码, 也就是通常意义上的类. 这里就有一个问题, classloader 从哪里知道 java 本身的类库及用户自己的类在什么地方呢? 或者有着缺省值(当前路径).
实际上 java 虚拟机是由 java luncher 初始化的, 也就是 java (或 java.exe)这个程序来做的. 虚拟机按以下顺序搜索并装载所有需要的类:
  1, 系统类: 组成 java 平台的类, 包含 rt.jar等类.
  2, 扩展类: 使用 java 扩展机制的类, 都是位于扩展目录($JAVA_HOME/jre/lib/ext)?
中的 .jar 档案包.
  3, 用户类: 开发者定义的类或者没有使用 java 扩展机制的第三方产品. 
以上的类,程序运行时,是如何找到的? 下面做个说明:
当我们在命令行输入java XXX 的时候,java.exe的工作就是找到合适的JRE来执行类文件。Java.exe依照如下逻辑来寻找JRE:
1. 自己的目录下有没有JRE目录
2. 父目录下的JRE子目录
3. 查询windows Registry(HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Runtime Environment\).
根据以上的逻辑,java找到JRE,进而找到系统类和扩展类(因为它们都位于JRE中,且位置固定?),所以“系统类”和“扩展类”的类查找问题就解决了,下面再谈谈用户类的查找,
用户类路径就是一些包含类文件的目录, .jar, .zip 文件的列表,我们要使用它,必须在命令行中使用 -classpath 选项或者使用 CLASSPATH 环境变量来确定这些类的位置或则按缺省查找,规则如下:
* ".", 指当前目录, 是缺省值.
* CLASSPATH 环境变量, 一旦设置, 将缺省值覆盖
* 命令行参数 -cp 或者 -classpath, 一旦指定, 将上两者覆盖.
* 由 -jar 参数指定的 .jar 档案包, 就把所有其他的值覆盖, 所有的类都来自这个指定的档案包中. 由于生成可执行的 .jar 文件, 还需要其他一些知识, 比如 package等,对于package,import机制,下一个专题再尝试谈谈.
  以上错漏之处,请大伙提出,先谢过
分享到:
评论
2 楼 wolf9s 2011-08-25  
很好,学习了。非常感谢!
1 楼 fxhbeyond 2011-07-12  
讲得挺详细的  顶一个

相关推荐

    java的编译路径与运行路径

    详解 java的编译路径与运行路径

    Java动态编译Java代码,运行在内存中,并执行

    获取当前执行的classpath的所有jar包的路径 * 3.通过java的ToolProvider创建JavaCompile,用来执行class源文件 * 4.创建DiagnosticCollector用来执行获取执行失败的错误结果 * 5.添加动态执行的编译环境 options ...

    使用VC++6.0编写小型java编译/运行系统

    使用VC++6.0编写小型java编译/运行系统,需要Java JDK的支持,安装好JDK后简单设置一下路径就可以使用了。主要解决了编译运行小型Java程序时,需要不断输入命令的麻烦,只需要拖动文件就可以编译,使Java学习变得...

    Java编译脚本

    windows下, Java编译运行脚本文件, 放入项目根目录下, 执行执行即可实现编译, 目前是将src目录下的源代码编译至classes目录下, 可以修改脚本定制编译路径. PS:编译后自动运行.

    java class文件反编译

    1、XJad是基于Jad核心的Java源程序反编译软件,内置Jad1.5.8e2; 2、可处理多个*.class文件,可以处理文件夹内的所有文件,甚至可以处理*.jar文件; 3、带有多页面文本编辑器,也可集成在资源管理器中,随时点击右键...

    DJ Java Decompiler 3.12.12.96 老朽痴拙汉化版(JAVA反编译)

    JAVA工具精品新译<5>DJ Java Decompiler 3.12.12.96 32位老朽痴拙...你不需要安装有Java虚拟机或者其它任何Java SDK环境,但是你安装了以上环境之后,DJ就可以创建、编译、运行JAR文件,在浏览器中运行applet小程序。

    命令行下的Java编译工具

    适合初学者用,个人用批处理编写的java编译工具。出于保护版权,转成了exe格式,人格保证,绝对无毒。 本人08年开始接触Java,初学者当然是使用黑框框编译啦,可是JDK编译器手动太麻烦,又要javac源文件,又要java...

    java反编译

    java反编译工具(jd-gui)是一款非常出色的电脑端java反编译工具。java反编译工具(jd-gui)拥有十分出色的反编译效率,能够有效提升整体工作的效率,节省更多时间,操作起来也相对简单,轻松进行反编译。 java反编译...

    java反编译工具

    1、XJad是基于Jad核心的Java源程序反编译软件,内置Jad1.5.8e2; 2、可处理多个*.class文件,可以处理文件夹内的所有文件,甚至可以处理*.jar文件; 3、带有多页面文本编辑器,也可集成在资源管理器中,随时点击右键...

    后台编译并运行java的脚本

    在windows下,可以指定jdk路径,后台编译并运行java的脚本

    批量反编译java类

    当要看别人的源码时,由于类包层次有时太多,分别反编译每个类文件,很费事,此软件只要你指明要反编译的类包和要输出的目标路径,就可以按照类包的层次一一对应地反编译成java文件。内置 反编译器是jad1.5.8g.

    XJad2.2_反编译JAVA

    1、XJad是基于Jad核心的Java源程序反编译软件,内置Jad1.5.8e2; 2、可处理多个*.class文件,可以处理文件夹内的所有文件,甚至可以处理*.jar文件; 3、带有多页面文本编辑器,也可集成在资源管理器中,随时点击右键...

    java反编译项目工程-可以将class 文件进行修改重新导包生成修改后的jar

    java反编译项目工程,可以将class 文件 进行 修改 重新导包 生成修改后的jar 步骤 1、将需要修改的 jar 包 放入 lib 目录下,并加入项目中 ,选中 jar 右击 选择 add a libray这个时候会看到 jar 的 目录 结构 2、...

    java自动编译项目

    配合svn中的Generate Log可以自动生成class文件包,前提需要配置项目编译路径,存储路径,项目名称

    java反编译工具(可以集成到eclipse当中)

    然后运行:jad -s java *.class (附,*.class指要反编译的文件名) 如果*.class文件和jad程序不在同一个目录,就要用到path环境变量, 将jad 所在目录加到path路径中即可:set path=%path%;f:\java\jad 若要了解jad...

    xjad java反编译工具

    xjad 是不错的java反编译工具, 能把CLASS文件编译成.java文件 功能特点: ======== 1、XJad是基于Jad核心的Java源程序反编译软件,内置Jad1.5.8e2; 2、可处理多个*.class文件,可以处理文件夹内的所有文件,甚至...

    GmSSL在linux下编译java接口

    linux上编译Java接口,文件中生成的libgmssljni.so库文件放在打印的java.library.path路径下。测试时java文件下,我自己写了个Test.java文件,可以成功调用java接口方法

    最给力的 JAVA 反编译工具,敬广大Java工作者。

    Java反编译工具主要用来将.class jar包 翻译为 Java代码,想要研究别人代码,有没有源代码,反编译是最好的路径。

    java反编译工具(含MyEclipse插件)

    2、先说外部反编译、这个比较简单、直接打开文件夹、解压里面的文件jd-gui-0.3.3.windows.zip 会得到一个jd-gui.exe应用程序、直接点开即可使用、进入后左上角有个打开文件的按钮、你可以选择你想要打开的class文件...

Global site tag (gtag.js) - Google Analytics