Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1955129
  • 博文数量: 328
  • 博客积分: 4302
  • 博客等级: 上校
  • 技术积分: 5486
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-01 11:14
个人简介

悲剧,绝对的悲剧,悲剧中的悲剧。

文章分类

全部博文(328)

文章存档

2017年(6)

2016年(18)

2015年(28)

2014年(73)

2013年(62)

2012年(58)

2011年(55)

2010年(28)

分类: Java

2015-06-01 11:19:10


javac命令行


javac.exe用于编译java源文件,生成.class文件
语法:javac  [option]  source
常用的[option]选项:

  1. -classpath 类路径
  2. 设置用户类路径,它将覆盖 CLASSPATH 环境变量中的用户类路径。若既未指定 CLASSPATH 又未指定 -classpath,则用户类路径由当前目录构成。有关详细信息,请参阅设置类路径。
  3. 若未指定 -sourcepath 选项,则将在用户类路径中查找类文件和源文件。

  4. -d 目录
  5. 设置类文件的目标目录。如果某个类是一个包的组成部分,则 javac 将把该类文件放入反映包名的子目录中,必要时创建目录。例如,如果指定 -d c:\myclasses 并且该类名叫 com.mypackage.MyClass,那么类文件就叫作 c:\myclasses\com\mypackage\MyClass.class。
  6. 若未指定 -d 选项,则 javac 将把类文件放到与源文件相同的目录中。

  7. 注意: -d 选项指定的目录不会被自动添加到用户类路径中。

  8. -deprecation
  9. 显示每种不鼓励使用的成员或类的使用或覆盖的说明。没有给出 -deprecation 选项的话, javac 将显示这类源文件的名称:这些源文件使用或覆盖不鼓励使用的成员或类。
  10. -encoding
  11. 设置源文件编码名称,例如 EUCJIS/SJIS。若未指定 -encoding 选项,则使用平台缺省的转换器。
  12. -g
  13. 生成所有的调试信息,包括局部变量。缺省情况下,只生成行号和源文件信息。
  14. -g:none
  15. 不生成任何调试信息。
  16. -g:{关键字列表}
  17. 只生成某些类型的调试信息,这些类型由逗号分隔的关键字列表所指定。有效的关键字有:
  18. source
  19. 源文件调试信息
  20. lines
  21. 行号调试信息
  22. vars
  23. 局部变量调试信息
  24. -nowarn
  25. 禁用警告信息。
  26. -O
  27. 优化代码以缩短执行时间。使用 -O 选项可能使编译速度下降、生成更大的类文件并使程序难以调试。
  28. 在 JDK 1.2 以前的版本中,javac 的 -g 选项和 -O 选项不能一起使用。在 JDK 1.2 中,可以将 -g 和 -O 选项结合起来,但可能会得到意想不到的结果,如丢失变量或重新定位代码或丢失代码。-O 选项不再自动打开 -depend 或关闭 -g 选项。同样, -O 选项也不再允许进行跨类内嵌。

  29. -sourcepath 源路径
  30. 指定用以查找类或接口定义的源代码路径。与用户类路径一样,源路径项用分号 (;) 进行分隔,它们可以是目录、JAR 归档文件或 ZIP 归档文件。如果使用包,那么目录或归档文件中的本地路径名必须反映包名。
  31. 注意:通过类路径查找的类,如果找到了其源文件,则可能会自动被重新编译。

  32. -verbose
  33. 冗长输出。它包括了每个所加载的类和每个所编译的源文件的有关信息。


java命令行


java.exe用于运行javac编译后生成的.class文件
语法:java   [option]  classname  [arguments]

常用的[option]选项:

1.     -client,-server
这两个参数用于设置虚拟机使用何种运行模式,client模式启动比较快,但运行时性能和内存管理效率不如server模式,通常用于客户端应用程序。相反,server模式启动比client慢,但可获得更高的运行性能。
在 windows上,缺省的虚拟机类型为client模式,如果要使用 server模式,就需要在启动虚拟机时加-server参数,以获得更高性能,对服务器端应用,推荐采用server模式,尤其是多个CPU的系统。在 Linux,Solaris上缺省采用server模式。 

2.     -hotspot
含义与client相同,jdk1.4以前使用的参数,jdk1.4开始不再使用,代之以client。

3.     -classpath,-cp
虚拟机在运行一个类时,需要将其装入内存,虚拟机搜索类的方式和顺序如下:
Bootstrap classes,Extension classes,User classes。
Bootstrap 中的路径是虚拟机自带的jar或zip文件,虚拟机首先搜索这些包文件,用System.getProperty("sun.boot.class.path")可得到虚拟机搜索的包名。
Extension是位于jre"lib"ext目录下的jar文件,虚拟机在搜索完Bootstrap后就搜索该目录下的jar文件。用System. getProperty("java.ext.dirs”)可得到虚拟机使用Extension搜索路径。
User classes搜索顺序为当前目录、环境变量 CLASSPATH、-classpath。

4.     -classpath
告知虚拟机搜索目录名、jar文档名、zip文档名,之间用分号;分隔。
例如当你自己开发了公共类并包装成一个common.jar包,在使用 common.jar中的类时,就需要用-classpath common.jar 告诉虚拟机从common.jar中查找该类,否则虚拟机就会抛出java.lang.NoClassDefFoundError异常,表明未找到类定义。 
在运行时可用System.getProperty(“java.class.path”)得到虚拟机查找类的路径。
使用-classpath后虚拟机将不再使用CLASSPATH中的类搜索路径,如果-classpath和CLASSPATH都没有设置,则虚拟机使用当前路径(.)作为类搜索路径。
推荐使用-classpath来定义虚拟机要搜索的类路径,而不要使用环境变量 CLASSPATH的搜索路径,以减少多个项目同时使用CLASSPATH时存在的潜在冲突。例如应用1要使用a1.0.jar中的类G,应用2要使用 a2.0.jar中的类G,a2.0.jar是a1.0.jar的升级包,当a1.0.jar,a2.0.jar都在CLASSPATH中,虚拟机搜索到第一个包中的类G时就停止搜索,如果应用1应用2的虚拟机都从CLASSPATH中搜索,就会有一个应用得不到正确版本的类G。

5.     -D=value
在虚拟机的系统属性中设置属性名/值对,运行在此虚拟机之上的应用程序可用System.getProperty(“propertyName”)得到value的值。
如果value中有空格,则需要用双引号将该值括起来,如-Dname=”space string”。
该参数通常用于设置系统级全局变量值,如配置文件路径,应为该属性在程序中任何地方都可访问。

6.    -verbose[:class|gc|jni]
在输出设备上显示虚拟机运行信息。
verbose和verbose:class含义相同,输出虚拟机装入的类的信息,显示的信息格式如下:
[Loaded java.io.FilePermission$1 from shared objects file]
当虚拟机报告类找不到或类冲突时可用此参数来诊断来查看虚拟机从装入类的情况。

7.     -verbose:gc
在虚拟机发生内存回收时在输出设备显示信息,格式如下:
[Full GC 268K->168K(1984K), 0.0187390 secs]
该参数用来监视虚拟机内存回收的情况。

8.     -verbose:jni
在虚拟机调用native方法时输出设备显示信息,格式如下:
[Dynamic-linking native method HelloNative.sum ... JNI]
该参数用来监视虚拟机调用本地方法的情况,在发生jni错误时可为诊断提供便利。

9.     -version
显示可运行的虚拟机版本信息然后退出。一台机器上装有不同版本的JDK时

10.-showversion
显示版本信息以及帮助信息。 内容来自dedecms 

11.-ea[:...|:]

12.-enableassertions[:...|:]
从JDK1.4开始,java可支持断言机制,用于诊断运行时问题。通常在测试阶段使断言有效,在正式运行时不需要运行断言。断言后的表达式的值是一个逻辑值,为true时断言不运行,为false时断言运行,抛出java.lang.AssertionError错误。
上述参数就用来设置虚拟机是否启动断言机制,缺省时虚拟机关闭断言机制,用-ea 可打开断言机制,不加和classname时运行所有包和类中的断言,如果希望只运行某些包或类中的断言,可将包名或类名加到-ea之后。例如要启动包com.foo.util中的断言,可用命令 –ea:com.foo.util 。

13.-da[:...|:]

14.-disableassertions[:...|:]
用来设置虚拟机关闭断言处理,packagename和classname的使用方法和-ea相同。

15.-esa | -enablesystemassertions
设置虚拟机显示系统类的断言。

16.-dsa | -disablesystemassertions
设置虚拟机关闭系统类的断言。 dedecms.com 

17.-agentlib:[=]
该参数是JDK5新引入的,用于虚拟机装载本地代理库。
Libname 为本地代理库文件名,虚拟机的搜索路径为环境变量PATH中的路径,options为传给本地库启动时的参数,多个参数之间用逗号分隔。在Windows 平台上虚拟机搜索本地库名为libname.dll的文件,在Unix上虚拟机搜索本地库名为libname.so的文件,搜索路径环境变量在不同系统上有所不同,Linux、SunOS、IRIX上为LD_LIBRARY_PATH,AIX上为LIBPATH,HP-UX上为SHLIB_PATH。
例如可使用-agentlib:hprof来获取虚拟机的运行情况,包括CPU、内存、线程等的运行数据,并可输出到指定文件中,可用-agentlib:hprof=help来得到使用帮助列表。在jre"bin目录下可发现hprof.dll文件。

18. -agentpath:[=]
设置虚拟机按全路径装载本地库,不再搜索PATH中的路径。其他功能和agentlib相同。

19.-javaagent:[=]
虚拟机启动时装入java语言设备代理。Jarpath文件中的mainfest 文件必须有Agent-Class属性。代理类要实现public static void premain(String agentArgs, Instrumentation inst)方法。当虚拟机初始化时,将按代理类的说明顺序调用premain方法。 copyright dedecms 

扩展参数说明

1.     -Xmixed
设置-client模式虚拟机对使用频率高的方式进行Just-In-Time编译和执行,对其他方法使用解释方式执行。该方式是虚拟机缺省模式。

2.     -Xint
设置-client模式下运行的虚拟机以解释方式执行类的字节码,不将字节码编译为本机码。

3.     -Xbootclasspath:path

4.     -Xbootclasspath/a:path

5.     -Xbootclasspath/p:path
改变虚拟机装载缺省系统运行包rt.jar而从-Xbootclasspath中设定的搜索路径中装载系统运行类。除非你自己能写一个运行时,否则不会用到该参数。
/a:将在缺省搜索路径后加上path 中的搜索路径。
/p:在缺省搜索路径前先搜索path中的搜索路径。

6.     -Xnoclassgc
关闭虚拟机对class的垃圾回收功能。

7.     -Xincgc
启动增量垃圾收集器,缺省是关闭的。增量垃圾收集器能减少偶然发生的长时间的垃圾回收造成的暂停时间。但增量垃圾收集器和应用程序并发执行,因此会占用部分CPU在应用程序上的功能。 

8.     -Xloggc:
将虚拟机每次垃圾回收的信息写到日志文件中,文件名由file指定,文件格式是平文件,内容和-verbose:gc输出内容相同。

9.     -Xbatch
虚拟机的缺省运行方式是在后台编译类代码,然后在前台执行代码,使用-Xbatch参数将关闭虚拟机后台编译,在前台编译完成后再执行。

10.-Xms
设置虚拟机可用内存堆的初始大小,缺省单位为字节,该大小为1024的整数倍并且要大于1MB,可用k(K)或m(M)为单位来设置较大的内存数。初始堆大小为2MB。
例如:-Xms6400K,-Xms256M

11.-Xmx
设置虚拟机内存堆的最大可用大小,缺省单位为字节。该值必须为1024整数倍,并且要大于2MB。可用k(K)或m(M)为单位来设置较大的内存数。缺省堆最大值为64MB。
例如:-Xmx81920K,-Xmx80M
当应用程序申请了大内存运行时虚拟机抛出java.lang.OutOfMemoryError: Java heap space错误,就需要使用-Xmx设媒洗蟮目捎媚诖娑选?BR>

12.-Xss
设置线程栈的大小,缺省单位为字节。与-Xmx类似,也可用K或M来设置较大的值。通常操作系统分配给线程栈的缺省大小为1MB。 
另外也可在java中创建线程对象时设置栈的大小,构造函数原型为Thread(ThreadGroup group, Runnable target, String name, long stackSize)。

13.-Xprof
输出CPU运行时的诊断信息。

14.-Xfuture
对类文件进行严格格式检查,以保证类代码符合类代码规范。为保持向后兼容,虚拟机缺省不进行严格的格式检查。

15.-Xrs
减少虚拟机中操作系统的信号(singals)的使用。该参数通常用在虚拟机以后台服务方式运行时使用(如Servlet)。

16.-Xcheck:jni


一个Java工程


参考这个博客

一般,一个工程下面都会有lib(引入的必要jar包),classes(保存.class文件),src(.java源代码)三个文件夹。

java文件夹的目录结构如下,文件之间的关系是Client.java调用了DemoService.java的方法;ServerImpl.java调用了DemoService.java的方法;Server.java调用了ServerImpl.java和DemoService.java的方法;

下面的文件,我只显示他们引用的包和类。

src/com/client/Client.java:


  1. package com.client;  
  2. import org.apache.thrift.TException;  
  3. import org.apache.thrift.protocol.TBinaryProtocol;  
  4. import org.apache.thrift.protocol.TProtocol;  
  5. import org.apache.thrift.transport.TSocket;  
  6. import org.apache.thrift.transport.TTransport;  
  7.   
  8. import com.demo.DemoService;  
  9.    
  10.   
  11. public class Client {  
  12.       
  13.     .................................................................................  
  14.   
  15. }  

src/com/demo/DemoService.java:

  1. /** 
  2.  * Autogenerated by Thrift Compiler (0.9.0) 
  3.  * 
  4.  * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING 
  5.  *  @generated 
  6.  */  
  7.   
  8. package com.demo;  
  9. import org.apache.thrift.scheme.IScheme;  
  10. import org.apache.thrift.scheme.SchemeFactory;  
  11. import org.apache.thrift.scheme.StandardScheme;  
  12.   
  13. import org.apache.thrift.scheme.TupleScheme;  
  14. import org.apache.thrift.protocol.TTupleProtocol;  
  15. import org.apache.thrift.protocol.TProtocolException;  
  16. import org.apache.thrift.EncodingUtils;  
  17. import org.apache.thrift.TException;  
  18. import java.util.List;  
  19. import java.util.ArrayList;  
  20. import java.util.Map;  
  21. import java.util.HashMap;  
  22. import java.util.EnumMap;  
  23. import java.util.Set;  
  24. import java.util.HashSet;  
  25. import java.util.EnumSet;  
  26. import java.util.Collections;  
  27. import java.util.BitSet;  
  28. import java.nio.ByteBuffer;  
  29. import java.util.Arrays;  
  30. import org.slf4j.Logger;  
  31. import org.slf4j.LoggerFactory;  
  32.   
  33. public class DemoService {  
  34. .................................................................  
  35. }  

src/com/server/Server.java:



  1. package com.server;  
  2. import org.apache.thrift.TProcessor;  
  3. import org.apache.thrift.protocol.TBinaryProtocol;  
  4. import org.apache.thrift.server.TServer;  
  5. import org.apache.thrift.server.TSimpleServer;  
  6. import org.apache.thrift.transport.TServerSocket;  
  7. import org.apache.thrift.transport.TTransportException;  
  8.   
  9. import com.demo.DemoService;  
  10. import com.server.ServerImpl;  
  11.   
  12. public class Server {  
  13.       
  14. ..................................................................................  
  15.   
  16. }  





make.sh脚本如下: 






  1. #!/bin/bash  
  2.   
  3. # Get current position  
  4. TOP_DIR=$(pwd)  
  5.   
  6. # Add all necessary jars  
  7. LIBPATH=lib/commons-codec-1.6.jar:lib/commons-logging-1.1.1.jar:lib/httpclient-4.2.5.jar:lib/httpcore-4.2.4.jar:lib/junit-4.4.jar:lib/libthrift-1.0.0.jar:lib/log4j-1.2.14.jar:lib/servlet-api-2.5.jar:lib/slf4j-api-1.5.8.jar:lib/slf4j-log4j12-1.5.8.jar  
  8.   
  9. #compile java file  
  10. javac -cp $LIBPATH                  src/com/demo/DemoService.java  -d ./classes/.   
  11. javac -cp $TOP_DIR/classes:$LIBPATH src/com/server/ServerImpl.java -d ./classes/.  
  12. javac -cp $TOP_DIR/classes:$LIBPATH src/com/server/Server.java     -d ./classes/.  
  13. javac -cp $TOP_DIR/classes:$LIBPATH src/com/client/Client.java     -d ./classes/.  


run.sh脚本如下:



  1. #!/bin/bash  
  2.   
  3. #Get client/server  
  4. SIDE=$1  
  5.   
  6. # Get current position  
  7. TOP_DIR=$(pwd)  
  8.   
  9. # Add all necessary jars  
  10. LIBPATH=lib/commons-codec-1.6.jar:lib/commons-logging-1.1.1.jar:lib/httpclient-4.2.5.jar:lib/httpcore-4.2.4.jar:lib/junit-4.4.jar:lib/libthrift-1.0.0.jar:lib/log4j-1.2.14.jar:lib/servlet-api-2.5.jar:lib/slf4j-api-1.5.8.jar:lib/slf4j-log4j12-1.5.8.jar  
  11.   
  12. #run program  
  13. if [ $SIDE == "server" ];then  
  14.     java -cp $TOP_DIR/classes:$LIBPATH  com/server/Server  
  15. else  
  16.     java -cp $TOP_DIR/classes:$LIBPATH  com/client/Client  
  17. fi  

进入thriftDemo文件夹下,执行./make.sh脚本,在classes文件夹下生成的文件如下:




调试


Java调度器为Java程序提供了一个命令行调试环境。它既可在本地,也可在与远程的解释器的一次对话中执行。
jdb于本地机器中可用如下的命令启动:
C:\>jdb classname
当你使用-debug选项开始一个Java例程时, 必须提供给Jdb 一个密码, 这样 Jdb才能开始运转起来。下表包含了所有jdb命令。

命令 功能
catch calssID 为特定异常出口而中断
classes 列出当前已知的类
clear classID:line 清除一个断点
cont 从断点处继续执行
down[n frames]  下移一个线程的堆栈
dump ID[ID...] 显示所有对象信息
exit(或quit) 退出调试器
help(或?) 列出所有命令
ignore classID 忽略特定的异常出口
list[line number] 显示源代码
load classbame 载入要调试的Java类
locals 在当前堆栈帧中显示所有局部变量
memory 报告内存使用情况
methods classID 列出一个类的成员函数集
print ID[ID...] 列出对象或域
resume [threadID...] 恢复线程(默认情况恢复所有线程)
run class [args] 开始执行已下载的Java类
step 执行当前行
stop in classID:method 在一成员函数中设一断点
stop at classID:line 在一行设一断点
suspend[threadID...] 停止一个线程(默认情况停止所有线程)
threads threadgroup 列出线程
thread threadID 设置当前线程
threadgroups 列出线程组
threadgroup name 设置当前线程组
up [n frames] 上移一个线程堆栈
use [path] 显示或改变源程序路径
where [threadID] or all 使一线程的堆线置空
!! 重复上一次命令

除了调试期间可用的命令,还有两个可选的命令行变量。它们可用于远程调试。具体用法如下所示:
-host hostname 该命令告诉Jdb到哪里去建立远程运行的Java解释器对话过程
-password password
本选项告诉Jdb 用哪个密码去与远程运行的Java 对话进程相连接。 密码 password是由运行带有-debug选项的Java解释器所提供的。


命令行传参


1. 运行Java程序的同时,可以通过输入参数给main函数中的接收参数数组args[],供程序内部使用!即当你在Java命令行后面带上参数,Java虚拟机就直接把它们存放到了main方法中的参数String数组里了。
2. args是Java命令行参数,因为参数可以为多个,所以要用数组来存我们在DOS中执行Java程序的时候使用“java 文件名 args参数”。args这个数组可以接收到这些参数。
另外,下面是一种设置HOME的通用方法

export JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::")

  1. public class Test {
  2.     public static void main(String[] args) {
  3.         if (args.length == 0) {
  4.             System.out.println("您调用main方法时没有指定任何参数!");
  5.             return;
  6.         }
  7.         System.out.println("您调用main方法时指定的参数包括:");
  8.         for (int i = 0; i < args.length; i++) {
  9.             System.out.println("参数" + (i + 1) + "的值为:" + args[i]);
  10.         }
  11.     }
  12. }
阅读(984) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~