java命令行运行小记

时间:2022-03-29 14:17:27
JDK6中提供了java.io.Console类专用来访问基于字符的控制台设备.
你的程序如果要与Windows下的cmd或者Linux下的Terminal交互,就可以用Console类代劳.(类似System.in和System.out)
但我们不总是能得到可用的Console, 一个JVM是否有可用的Console依赖于底层平台和JVM如何被调用.
如果JVM是在交互式命令行(比如Windows的cmd)中启动的,并且输入输出没有重定向到另外的地方,那么就可以得到一个可用的Console实例。

在使用 IDE 的情况下,是无法获取到Console实例的,原因在于在 IDE 的环境下,重新定向了标准输入和输出流,也是就是将系统控制台上的输入输出重定向到了 IDE 的控制台中

因此,我们有时需要以命令行运行java程序;
但是,如果我们的main函数入口类含有包结构的话,在运行时经常出现加载器找到类。
这里不去解释java的classpath,路径与包,java,javac参数的含义。
只是提供两种解决办法:
1.如果程序的包结构简单,比如,都在一个包结构下。可以在源码中去掉import语句,使带有main入口类处于一级结构。
  然后使用javac,java命令运行

2.如果程序所属的项目庞大,简单修改会引起其他类文件的修改,可以采用运行jar包的方式运行程序。

 jar包

java里用package的概念避免重复命名的问题。有点像C++的namespace。同一个包里的类是可以直接使用的。不同包的话,则需要在.java文件头部import进对应的package。初学者写的helloworld程序当然是不用注意到包的问题,但当工程越来越大,重复命名的可能性增大,我们就必须依靠package的概念来更好的管理我们的代码了。

同时,为了方便管理、传输,jar包出现了。

jar包其实是用zip压缩的文件包。我们可以打包自己的package,方便复用,到哪果然,也可以直接引用文件夹(此时注意,必须引用文件夹的根目录,比如文件定义为package mypackage.foo , 那个必须将myapackage这个文件夹连同内部的foo文件一起放在相应的路径上)

制作jar压缩包和解压缩包的命令如下:

 jar -cvf foo.jar foo

其中最后一个参数为需要压缩的文件包。-cvf几个选项中,f必须放在最后,f后面紧跟的必须是output的文件名。v表示输出详细信息(verbose)

对应的解压缩命令为:

 jar -xvf foo.jar


注意其中有个可选的mainifest文件,在META-INF/MANIFEST.MF路径上。

jar cvfm test.jar manifest.mf test
这里 test.jar 和 manifest.mf 两个文件,分别是对应的参数 f 和 m,其重头戏在 manifest.mf。因为要创建可执行的 JAR 文件包,光靠指定一个 manifest.mf 文件是不够的,因为 MANIFEST 是 JAR 文件包的特征,可执行的 JAR 文件包和不可执行的 JAR 文件包都包含 MANIFEST。关键在于可执行 JAR 文件包的 MANIFEST,其内容包含了 Main-Class 一项。这在 MANIFEST 中书写格式如下:
Main-Class: 可执行主类全名(包含包名)
例如,假设上例中的 Test.class 是属于 test 包的,而且是可执行的类 (定义了 public static void main(String[]) 方法),那么这个 manifest.mf 可以编辑如下:
Main-Class: test.Test <回车>;
这个 manifest.mf 可以放在任何位置,也可以是其它的文件名,只需要有 Main-Class: test.Test 一行,且该行以一个回车符结束即可。


我们可以在manifest.mf文件中加入如下语句
Main-Class: myPackage.MyClass
指定MyClass类为具有main()入口的主类。再利用如下语句,就可以值执行对应的程序了
java -jar foo.jar