java基本命令的使用

从今天起,开始记录走过的点滴,不喜勿拍


java javac命令的使用


一、javac
命令格式如下:
javac <options> <source files>
<options> 选项
常见的有:
-d 指定生成的文件存放路径
-cp 编译依赖的类路径
<source files> 源文件列表

由命令格式可以看出,javac命令先写参数(无顺序),最后指定待编译的源文件


命令形式为:
javac -classpath lib/jxl.jar -sourcepath src -d bin @sourcelist.txt
其中sourcelist.txt为源文件列表文件,类似于
com\bd\const\Constant.java


此处以一个完整的Demo进行举例说明,工程目录为
K:\work\workspace\CalcOpertion
只有一个类com.zt.util.Calculator,完成整数的加减乘除算法运算


进入命令行
切换到当前工程目录,执行
javac -d bin src\com\zt\util\Calculator.java
结果为
在bin目录下生成com\zt\util\Calculator.class


如果src\com\zt\util目录下不只一个源文件,可以执行如下命令编译,否则就得全部列出文件名
javac -d bin src\com\zt\util\*.java
*表示通配符


到此,至少可以得出两点结论:
1.-d指定的目录下生成的class文件是按照包名路径存放的(不写-d,会存放.java同级目录中,其实也是按包名存放的)
2.javac命令可以很轻松的编译某个命令下的所有.java源文件


基于上述两点,有一个办法可以解决源文件存放在不同包的编译问题
即将所有源文件拷贝到一个目录,然后编译即可。可以写这个脚本很容易实现。


二、采用jar打包
进入命令行
cd bin  // 切换到bin目录,不能在当前工程目录下执行打包,会将bin目录级别也打包进去
jar -cvf ./../CalcOperation.jar   com  // 在工程目录下生成.jar包


三、新建一个工程,用来使用Calculator.java计算器类
工程目录:K:\work\workspace\CalcOpertionTest
只有一个类com.zt.util.test.CalculatorTest,在其main方法中调用计算器类完成加减乘除操作
当然需要在build path中将CalcOperation.jar包依赖进来


进入命令行,切换到当前工程目录
1)执行编译:
K:\work\workspace\CalcOpertionTest>javac -d bin src\com\zt\util\test\CalculatorT
est.java
src\com\zt\util\test\CalculatorTest.java:3: 错误: 找不到符号
import com.zt.util.Calculator;
可以看到编译出错,显然,编译缺少依赖,重新执行:


K:\work\workspace\CalcOpertionTest>javac -d bin -cp K:\work\workspace\CalcOperti
on\CalcOperation.jar src\com\zt\util\test\CalculatorTest.java
添加-cp选项后,成功编译,并在bin目录下生成了字节码文件


2)开始运行
K:\work\workspace\CalcOpertionTest>java \bin\CalculatorTest
错误: 找不到或无法加载主类 \bin\CalculatorTest


K:\work\workspace\CalcOpertionTest>cd bin


K:\work\workspace\CalcOpertionTest\bin>java CalculatorTest
错误: 找不到或无法加载主类 CalculatorTest


上述两种方式很显然都找不到要运行的CalculatorTest类,因为运行前需要先加载,
加载的方式为系统类加载器加载路径为环境变量classpath下的类。
继续执行:
K:\work\workspace\CalcOpertionTest\bin>java com.zt.util.test.CalculatorTest
Exception in thread "main" java.lang.NoClassDefFoundError: com/zt/util/Calculato
r
        at com.zt.util.test.CalculatorTest.main(CalculatorTest.java:7)
Caused by: java.lang.ClassNotFoundException: com.zt.util.Calculator
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
        ... 1 more
这个错误提示表明CalculatorTest类找到了,而且加载的路径为
当前路径加上类全名,其中包名会在转换为目录的路径,可以想象,如果没有包名,就会直接执行当前目录下的类
进一步看,在执行CalculatorTest类的main方法时调用Calculator类时,发现找不到了
为什么会找不到呢,没告诉java依赖的jar路径呗


K:\work\workspace\CalcOpertionTest\bin>java -cp K:\work\workspace\CalcOpertion\C
alcOperation.jar com.zt.util.test.CalculatorTest
错误: 找不到或无法加载主类 com.zt.util.test.CalculatorTest
满以为把cp路径加上应该就欧拉,结果发现打回原形了。


什么原因呢,还是路径的问题啊,说明新给的路径上没有CalculatorTest了


K:\work\workspace\CalcOpertionTest\bin>java -cp .;K:\work\workspace\CalcOpertion
\CalcOperation.jar com.zt.util.test.CalculatorTest
a + b = 12
a - b = 8
a * b = 20
a / b = 5.0


在cp上加上一个点,表示当前路径也包含,终于完事ok了。


3)打包下,很简单
K:\work\workspace\CalcOpertionTest\bin>jar -cvf CalcOperationTest.jar com
就会在bin目录下生成CalcOperationTest.jar文件


4)扩展,将CalcOperationTest.jar拷贝到工程根目录下,再次运行
K:\work\workspace\CalcOpertionTest>java -cp K:\work\workspace\CalcOpertionTest\C
alcOperationTest.jar;K:\work\workspace\CalcOpertion\CalcOperation.jar com.zt.uti
l.test.CalculatorTest
a + b = 12
a - b = 8
a * b = 20
a / b = 5.0


K:\work\workspace\CalcOpertionTest>java -cp K:\work\workspace\CalcOpertionTest\*
;K:\work\workspace\CalcOpertion\CalcOperation.jar com.zt.util.test.CalculatorTest
a + b = 12
a - b = 8
a * b = 20
a / b = 5.0


其中第二种方法中的*表示所有文件都包含。



总结:使用这些命令经常碰到的问题就是提示一堆类找不到错误,解决的基本原则是设置cp,注意目录的关系,即:
java基本命令中的选项值若有目录,都表示当前目录,不包含子目录,比如cp类路径,都需要显示的写明子目录,否则会找不到。
以及通配符点和星号的灵活使用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值