cmd测试java程序出错,Java程序运行机制及cmd编译运行探究(三) 测试类运行jar包...

本文详细探讨了Java程序中如何通过cmd命令编译并运行包含工具类的jar包,重点比较了randomutil与randomutil2的不同打包方式,以及在测试类中正确引用和运行jar包的方法,揭示了类路径设置的技巧和jar包打包的规范。
摘要由CSDN通过智能技术生成

Java程序运行机制及cmd编译运行探究(三) 测试类运行jar包

在Java程序运行机制及cmd编译运行探究(二) cmd编译运行Java程序并打成jar包中,我编写了一个生成随机数的工具类,编译过后,把字节码文件打成了2个jar包,放在d:\jar目录下。randomutil是正常打包,只包含了与class文件中package语句相匹配的文件结构,而randomutil2则把这个文件结构在本地磁盘上的路径也打包了进去。那么这两个jar包有什么区别?怎么使用这个jar包中的类及方法呢?以下,我编写一个测试类,来进行研究。在此过程中,如果遇到cmd命令不明白的,可以参看Java程序运行机制及cmd编译运行探究(一)准备工作。

326ec3a6b24e75483f3d3a32bc0fc89b.png

一、编写测试类

//注意这里第一句是import语句,说明要引入其他类,而引入的类的全类名和被引入类的package语句保持一致

import pers.tony.utils.RandomUtils;

public class RandomTest

{

public static void main(String[] args)

{

//调用jar包中随机数的生成方法

System.out.println(RandomUtils.makeRandom());

}

}

保存源代码文件,命名为RandomTest.java,存储在d:\testclass目录下,如图所示:

ddd73b186c7ea7d9e320b74554439cdc.png

注意代码第一句的import,说明需要引用其他类。

二、编译源代码

进入命令行,先输入正确的命令:javac -classpath d:\jar\randomutil.jar d:\testclass\RandomTest.java

97f9e2f53da5a100e8bfa12dc32f21d0.png

abe11d8a81be81c3a657268112f730d1.png

可以看到测试类编译成功。简单解释下这个命令,意思是现在需要编译d:\testclass目录下的RandomTest文件,而编译这个类需要一些其他的类,比如这个类在开头import了一些其他类,那这些被引入的类去哪儿找呢?去d:\jar\randomutil.jar里面找,-classpath参数就是指定了类的搜索路径,如果不指定去哪里搜索这些被引用的类,编译就无法通过,如下图:

2f069898d2f2ca759dd0c1a9798b7044.png

注意:

当需要引入的类是在jar包中时,-classpath参数的值一定要写jar包所在的路径加上jar包名,.jar后缀名也要写。

为什么一定要这么写呢?因为我们测试类import语句导入的是pers.tony.utils.RandomUtils的全类名,根据-classpath参数值,它会以d:\jar\randomutil.jar\pers\tony\utils这样的物理路径去找被引用的RandomUtils.class(即classpath的路径+import的路径),如果这里省略了路径或者路径不正确,比如.jar不写,在物理路径下自然找不到RandomUtils.class文件,测试类也就无法编译成功。

题外话:引用jar包中的类,-classpath参数需要把jar包的路径和名字写全,但如果直接引用的是class文件,则-classpath参数写到class文件所在目录就可以了。其实想想也很简单,上面我们写编译命令时classpath值也只写到jar包一层,没有写成javac

-classpath d:\jar\randomutil.jar\pers\tony\utils\RandomUtils  d:\testclass\RandomTest.java,因为pers\tony\utils\RandomUtils.class这部分的路径由源代码中的import语句代劳了。

三、运行字节码文件

在测试类编译过程中,由于用到其他类,我们使用-classpath参数指定了程序编译时查找相关类的路径,在运行测试类的时候同样需要指定。输入命令:java -classpath .;d:\jar\randomutil.jar

RandomTest,可以看到调用jar包成功。

b956ba1d929d90c9852008698d857609.png

仔细看-classpath参数,和之前编译时候相比多了一个.;,其中点代表当前路径,分号代表分割符,分割了参数的值。

为什么需要为-classpath参数加上.这个值呢?因为在运行Java程序时,如果指定了-classpath参数,虚拟机会完全按照参数值去寻找当前类的,也就是说如果写成java -classpath d:\jar\randomutil.jar

RandomTest,所有要用的类都在d:\jar\randomutil.jar下找,包括RandomTest类,可我们知道RandomTest类不在jar包下,而是当前路径,所以必须加上点。否则我要运行RandomTest类,结果连RandomTest类都找不到,效果如下:

6af2773f0f0470f7755b840fecec0972.png

好了,到此解决了jar包的调用问题,然而以上是根据randomutil包进行测试的,那上一篇中的把本地路径一起打成包的randomutil2到底能不能调用呢?

先用randomutil2.jar去编译RandomTest,输入命令javac

-classpath d:\jar\randomutil2.jar d:\testclass\RandomTest.java

根据之前得到的结论:虚拟机根据classpath参数的路径+测试类import语句的路径去搜索所有相关类。这样写,虚拟机会以d:\jar\randomutil2.jar\pers\tony\utils目录去搜索RandomUtils.class,但我们知道之前randomutil2打包的时候,根目录是cmdtest,而现在命令中压根没有,这样的话肯定找不到RandomUtils.class,编译肯定过不了,试一下,果然失败!

7eb2432d4d111a4b719a303a94f531dd.png

想一想,上述命令失败的原因是因为寻找类的路径少了个cmdtest目录,那最有可能成功的就是想办法去补全cmdtest这个目录

有两种方法

1.

改命令,在jar包全路径后面加上cmdtest目录

javac -classpath d:\jar\randomutil2.jar\cmdtest d:\testclass\RandomTest.java

2. 修改源代码中的import语句

把import pers.tony.utils.RandomUtils;改成import cmdtest.pers.tony.utils.RandomUtils;

这两种方法至少从表面看,搜索相关类的路径是对的,可结果呢?都不行

比较麻烦就不贴图了,第一种我也不知道为什么,可能规定就是不能写jar包中的目录,可能是引用jar包有某种机制。第二种想一想,我import的是cmdtest.pers.tony.utils.RandomUtils类,可实际上RandomUtils类中的package语句是pers.tony.utils.RandomUtils啊,不匹配所以有问题,可能我的想法有偏差,欢迎指正。可不管怎么说,实际试下来打jar包时要把且只能把和类package语句结构一致的包结构进行打包,否则引用的时候会出现问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Commons Lang这一组API也是提供一些基础的、通用的操作和处理,如自动生成toString()的结果、自动实现hashCode()和equals()方法、数组操作、枚举、日期和时间的处理等等。 这一组API的所有包名都以org.apache.commons.lang开头,共有如下8个包: org.apache.commons.lang org.apache.commons.lang.builder org.apache.commons.lang.enum org.apache.commons.lang.enums org.apache.commons.lang.exception org.apache.commons.lang.math org.apache.commons.lang.mutable org.apache.commons.lang.time 其中的lang.enum已不建议使用,替代它的是紧随其后的lang.enums包。 lang包主要是一些可以高度重用的Util;lang.builder包包含了一组用于产生每个Java中都常使用到的toString()、 hashCode()、equals()、compareTo()等等方法的构造器;lang.enums包顾名思义用于处理枚 举;lang.exception包用于处理Java标准API中的exception,为1.4之前版本提供Nested Exception功能;lang.math包用于处理数字;lang.mutable用于包装值型变量;lang.time包提供处理日期和时间的功 能。 org.apache.commons.lang包,这个包提供了一些有用的包含static方法的Util。除了6个Exception和2个已经deprecated的数字之外,commons.lang包共包含了17个实用的: ArrayUtils – 用于对数组的操作,如添加、查找、删除、子数组、倒序、元素型转换等; BitField – 用于操作位元,提供了一些方便而安全的方法; BooleanUtils – 用于操作和转换boolean或者Boolean及相应的数组; CharEncoding – 包含了Java环境支持的字符编码,提供是否支持某种编码的判断; CharRange – 用于设定字符范围并做相应检查; CharSet – 用于设定一组字符作为范围并做相应检查; CharSetUtils – 用于操作CharSet; CharUtils – 用于操作char值和Character对象; ClassUtils – 用于对Java的操作,不使用反射; ObjectUtils – 用于操作Java对象,提供null安全的访问和其他一些功能; RandomStringUtils – 用于生成随机的字符串; SerializationUtils – 用于处理对象序列化,提供比一般Java序列化更高级的处理能力; StringEscapeUtils – 用于正确处理转义字符,产生正确的JavaJavaScript、HTML、XML和SQL代码; StringUtils – 处理String的核心,提供了相当多的功能; SystemUtils – 在java.lang.System基础上提供更方便的访问,如用户路径、Java版本、时区、操作系统等判断; Validate – 提供验证的操作,有点似assert断言; WordUtils – 用于处理单词大小写、换行等。 。。。。。。
commons-lang3.3.1.jar、Apache Commons包中的一个,包含了一些数据型工具,是java.lang.*的扩展。必须使用的jar包。为JRE5.0+的更好的版本所提供 Jar文件包含的: META-INF/MANIFEST.MFMETA-INF/LICENSE.txtMETA-INF/NOTICE.txtorg.apache.commons.lang.ArrayUtils.class org.apache.commons.lang.BitField.class org.apache.commons.lang.BooleanUtils.class org.apache.commons.lang.CharEncoding.class org.apache.commons.lang.CharRange.class org.apache.commons.lang.CharSet.class org.apache.commons.lang.CharSetUtils.class org.apache.commons.lang.CharUtils.class org.apache.commons.lang.ClassUtils.class org.apache.commons.lang.Entities$ArrayEntityMap.class org.apache.commons.lang.Entities$BinaryEntityMap.class org.apache.commons.lang.Entities$EntityMap.class org.apache.commons.lang.Entities$HashEntityMap.class org.apache.commons.lang.Entities$LookupEntityMap.class org.apache.commons.lang.Entities$MapIntMap.class org.apache.commons.lang.Entities$PrimitiveEntityMap.class org.apache.commons.lang.Entities$TreeEntityMap.class org.apache.commons.lang.Entities.class org.apache.commons.lang.IllegalClassException.class org.apache.commons.lang.IncompleteArgumentException.class org.apache.commons.lang.IntHashMap$Entry.class org.apache.commons.lang.IntHashMap.class org.apache.commons.lang.LocaleUtils.class org.apache.commons.lang.NotImplementedException.class org.apache.commons.lang.NullArgumentException.class org.apache.commons.lang.NumberRange.class org.apache.commons.lang.NumberUtils.class org.apache.commons.lang.ObjectUtils$Null.class org.apache.commons.lang.ObjectUtils.class org.apache.commons.lang.RandomStringUtils.class org.apache.commons.lang.SerializationException.class org.apache.commons.lang.SerializationUtils.class org.apache.commons.lang.StringEscapeUtils.class org.apache.commons.lang.StringUtils.class org.apache.commons.lang.SystemUtils.class org.apache.commons.lang.UnhandledException.class org.apache.commons.lang.Validate.class org.apache.commons.lang.WordUtils.class org.apache.commons.lang.builder.CompareToBuilder.class org.apache.commons.lang.builder.EqualsBuilder.class org.apache.commons.lang.builder.HashCodeBuilder.class org.apache.commons.lang.builder.ReflectionToStringBuilder$1.class org.apache.commons.lang.builder.ReflectionToStringBuilder.class org.apache.commons.lang.builder.StandardToStringStyle.class org.apache.commons.lang.builder.ToStringBuilder.class org.apache.commons.lang.builder.ToStringStyle$DefaultToStringStyle.class org.apache.commons.lang.builder.ToStringStyle$MultiLineToStringStyle.class org.apache.commons.lang.builder.ToStringStyle$NoFieldNameToStringStyle.class org.apache.commons.lang.builder.ToStringStyle$ShortPrefixToStringStyle.class org.apache.commons.lang.builder.ToStringStyle$SimpleToStringStyle.class org.apache.commons.lang.builder.ToStringStyle.class org.apache.commons.lang.enum.Enum$Entry.class org.apache.commons.lang.enum.Enum.class org.apache.commons.lang.enum.EnumUtils.class org.apache.commons.lang.enum.ValuedEnum.class org.apache.commons.lang.enums.Enum$Entry.class org.apache.commons.lang.enums.Enum.class org.apache.commons.lang.enums.EnumUtils.class org.apache.commons.lang.enums.ValuedEnum.class org.apache.commons.lang.exception.ExceptionUtils.class org.apache.commons.lang.exception.Nestable.class org.apache.commons.lang.exception.NestableDelegate.class org.apache.commons.lang.exception.NestableError.class org.apache.commons.lang.exception.NestableException.class org.apache.commons.lang.exception.NestableRuntimeException.class org.apache.commons.lang.math.DoubleRange.class org.apache.commons.lang.math.FloatRange.class org.apache.commons.lang.math.Fraction.class org.apache.commons.lang.math.IntRange.class org.apache.commons.lang.math.JVMRandom.class org.apache.commons.lang.math.LongRange.class org.apache.commons.lang.math.NumberRange.class org.apache.commons.lang.math.NumberUtils.class org.apache.commons.lang.math.RandomUtils.class org.apache.commons.lang.math.Range.class org.apache.commons.lang.mutable.Mutable.class org.apache.commons.lang.mutable.MutableBoolean.class org.apache.commons.lang.mutable.MutableByte.class org.apache.commons.lang.mutable.MutableDouble.class org.apache.commons.lang.mutable.MutableFloat.class org.apache.commons.lang.mutable.MutableInt.class org.apache.commons.lang.mutable.MutableLong.class org.apache.commons.lang.mutable.MutableObject.class org.apache.commons.lang.mutable.MutableShort.class org.apache.commons.lang.text.CompositeFormat.class org.apache.commons.lang.text.StrBuilder$StrBuilderReader.class org.apache.commons.lang.text.StrBuilder$StrBuilderTokenizer.class org.apache.commons.lang.text.StrBuilder$StrBuilderWriter.class org.apache.commons.lang.text.StrBuilder.class org.apache.commons.lang.text.StrLookup$MapStrLookup.class org.apache.commons.lang.text.StrLookup.class org.apache.commons.lang.text.StrMatcher$CharMatcher.class org.apache.commons.lang.text.StrMatcher$CharSetMatcher.class org.apache.commons.lang.text.StrMatcher$NoMatcher.class org.apache.commons.lang.text.StrMatcher$StringMatcher.class org.apache.commons.lang.text.StrMatcher$TrimMatcher.class org.apache.commons.lang.text.StrMatcher.class org.apache.commons.lang.text.StrSubstitutor.class org.apache.commons.lang.text.StrTokenizer.class org.apache.commons.lang.time.DateFormatUtils.class org.apache.commons.lang.time.DateUtils$DateIterator.class org.apache.commons.lang.time.DateUtils.class org.apache.commons.lang.time.DurationFormatUtils$Token.class org.apache.commons.lang.time.DurationFormatUtils.class org.apache.commons.lang.time.FastDateFormat$CharacterLiteral.class org.apache.commons.lang.time.FastDateFormat$NumberRule.class org.apache.commons.lang.time.FastDateFormat$PaddedNumberField.class org.apache.commons.lang.time.FastDateFormat$Pair.class org.apache.commons.lang.time.FastDateFormat$Rule.class org.apache.commons.lang.time.FastDateFormat$StringLiteral.class org.apache.commons.lang.time.FastDateFormat$TextField.class org.apache.commons.lang.time.FastDateFormat$TimeZoneDisplayKey.class org.apache.commons.lang.time.FastDateFormat$TimeZoneNameRule.class org.apache.commons.lang.time.FastDateFormat$TimeZoneNumberRule.class org.apache.commons.lang.time.FastDateFormat$TwelveHourField.class org.apache.commons.lang.time.FastDateFormat$TwentyFourHourField.class org.apache.commons.lang.time.FastDateFormat$TwoDigitMonthField.class org.apache.commons.lang.time.FastDateFormat$TwoDigitNumberField.class org.apache.commons.lang.time.FastDateFormat$TwoDigitYearField.class org.apache.commons.lang.time.FastDateFormat$UnpaddedMonthField.class org.apache.commons.lang.time.FastDateFormat$UnpaddedNumberField.class org.apache.commons.lang.time.FastDateFormat.class org.apache.commons.lang.time.StopWatch.class
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值