使用JDK编译
简介
JDK(Java Development Kit)是 Java 开发者进行 Java 开发所必须的软件包,包含 JRE(Java Runtime Environment)和编译、调测工具。openEuler在OpenJDK 的基础上进行了 GC 优化、并发稳定性增强、安全性增强等修改,提高了 Java 应用程序在 ARM 上的性能和稳定性。
基本规则
文件类型及工具
对于任何给定的输入文件,文件类型决定采用何种工具进行处理。JDK常用的文件类型如表1所示,JDK常用的工具如表2所示。
表 1 JDK常用的文件类型
java的字节码文件,是一种和任何具体机器环境及操作系统环境无关的中间代码。它是一种二进制文件,是Java 源文件由 Java 编译器编译后生成的目标代码文件。 | |
表 2 JDK常用的工具
java程序生成流程
通过JDK将java源代码文件生成并运行Java程序,需要经过编译和运行。
- 编译:是指使用Java编译器(javac)将java源代码文件(.java文件)编译为.class的字节码文件。
- 运行:是指在Java虚拟机上执行字节码文件。
JDK常用工具选项
javac编译选项
javac编译的命令格式为:javac [options] [sourcefiles] [classes] [@argfiles]
其中:
options :命令选项。
sourcefiles :一个或多个需要编译的源文件。
classes :一个或多个要为注释处理的类。
@argfiles :一个或多个列出选项和源文件的文件。这些文件中不允许有-J选项。
javac是java编译器,其 options 参数取值很多,但大部分并不常用,常用的 options 取值如表3所示。
表 3 javac常用的编译选项
java运行选项
java运行的格式为:
运行类文件:java [options] classesname [args]
运行jar文件:java [options] -jar filename [args]
其中:
options :命令选项,选项之间用空格分隔。
classname :运行的.class文件名。
filename :运行的.jar文件名。
args:传递给main()函数的参数,参数之间用空格分隔。
java是运行java应用程序的工具,其 options 参数取值很多,但大部分并不常用,常用的 options 取值如表4所示。
表 4 java常用的运行选项
jar打包选项
jar的命令格式为:jar {c | t | x | u}[vfm0M] [jarfile] [manifest] [-C dir] file...
jar命令参数说明如表5所示。
表 5 jar命令参数说明
类库
java类库是以包的形式实现的,包是类和接口的集合。java编译器为每个类生成一个字节码文件,且文件名与类名相同,因此同名的类之间就有可能发生冲突。java语言中,把一组类和接口封装在一个包内,包可以有效地管理类名空间,位于不同包中的类即使同名也不会冲突,从而解决了同名类之间可能发生的冲突问题,为管理大量的类和接口提供了方便,也有利于类和接口的安全。
除java提供的许多包外,开发者也可以自定义包,把自己编写的类和接口等组成程序包的形式,以便后续使用。
自定义包需要先声明包,然后再使用包。
包的声明
包的声明格式为:package pkg1[.pkg2[.pkg3...]];
为了声明一个包,首先必须建立一个相应的目录结构,子目录与包名一致,然后在需要放入该包的类文件开头声明包,表示该文件的全部类都属于这个包。包声明中的“.”指明了目录的层次。如果源程序文件中没有package语句,则指定为无名包。无名包没有路径,一般情况下,java仍然会把源文件中的类存储在当前工作目录(即存放java源文件的目录)下。
包声明语句必须被加到源程序文件的起始部分,而且前面不能有注释和空格。如果在不同源程序文件中使用相同的包声明语句,就可以将不同源程序文件中的类都包含在相同的包中。
包的引用
在 Java 中,为了能使用java提供的包中的公用类,或者使用自定义的包中的类,有两种方法。
在要引用的类名前带上包名。
如:name.A obj=new name.A ();
其中,name为包名,A为类名,obj为对象。表示程序中用name包中的A类定义一个对象obj。
示例:新建一个example包中Test类的test对象。
example.Test test = new example.Test();
在文件开头使用import来导入包中的类。
import语句的格式为:import pkg1[.pkg2[.pkg3...]].(classname | *);
其中,pkg1[.pkg2[.pkg3...]]表明包的层次,classname为所要导入的类。如果要从一个包中导入多个类,则可以使用通配符“*”来替代。
示例:导入example包中的Test类。
import example.Test;
示例:将example 整个包导入。
import example.*;
示例
编译不带包的java程序示例
cd到代码目录,此处以用户“~/code”进行举例。如下所示:
$ cd ~/code
编写Hello World程序,保存为HelloWorld.java,此处以编译Hello World程序进行举例说明。示例如下:
$ vi HelloWorld.java
代码内容示例:
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } }
在代码目录,执行编译,使用命令:
$ javac HelloWorld.java
编译执行未报错,表明执行通过。
编译完成后,会生成 HelloWorld.class 文件,通过java命令可执行查看结果,示例如下:
$ java HelloWorld Hello World
编译带包的java程序示例
cd到代码目录,此处以用户“~/code”进行举例。并在该目录下创建“~/code/Test/my/example”、“~/code/Hello/world/developers”、“~/code/Hi/openos/openeuler”子目录,分别用于存放源文件。
$ cd ~/code $ mkdir -p Test/my/example $ mkdir -p Hello/world/developers $ mkdir -p Hi/openos/openeuler
cd到~/code/Test/my/example目录,创建Test.java。
$ cd ~/code/Test/my/example $ vi Test.java
Test.java代码内容示例:
package my.example; import world.developers.Hello; import openos.openeuler.Hi; public class Test { public static void main(String[] args) { Hello me = new Hello(); me.hello(); Hi you = new Hi(); you.hi(); } }
cd到~/code/Hello/world/developers目录,创建Hello.java。
$ cd ~/code/Hello/world/developers $ vi Hello.java
Hello.java代码内容示例:
package world.developers; public class Hello { public void hello(){ System.out.println("Hello, openEuler."); } }
~/code/Hi/openos/openeuler目录,创建Hi.java。
$ cd ~/code/Hi/openos/openeuler $ vi Hi.java
Hi.java代码内容示例:
package openos.openeuler; public class Hi { public void hi(){ System.out.println("Hi, the global developers."); } }
cd到~/code,使用javac编译源文件。
$ cd ~/code $ javac -classpath Hello:Hi Test/my/example/Test.java
执行完命令后,会在“~/code/Test/my/example”、“~/code/Hello/world/developers”、“~/code/Hi/openos/openeuler”目录下分别生成Test.class、Hello.class、Hi.class文件。
cd到~/code,使用java运行Test程序。
$ cd ~/code $ java -classpath Test:Hello:Hi my/example/Test
执行结果如下所示:
Hello, openEuler. Hi, the global developers.