长期支持版本

    使用JDK编译

    简介

    JDK(Java Development Kit)是 Java 开发者进行 Java 开发所必须的软件包,包含 JRE(Java Runtime Environment)和编译、调测工具。openEuler在OpenJDK 的基础上进行了 GC 优化、并发稳定性增强、安全性增强等修改,提高了 Java 应用程序在 ARM 上的性能和稳定性。

    基本规则

    文件类型及工具

    对于任何给定的输入文件,文件类型决定采用何种工具进行处理。JDK常用的文件类型如表1所示,JDK常用的工具如表2所示。

    表 1 JDK常用的文件类型

    扩展名(后缀)

    说明

    .java

    Java语言源代码文件。

    .class

    Java的字节码文件,是一种和任何具体机器环境及操作系统环境无关的中间代码。它是一种二进制文件,是Java 源文件由 Java 编译器编译后生成的目标代码文件。

    .jar

    Java的jar压缩文件。

    表 2 JDK常用的工具

    工具名称

    说明

    java

    Java运行工具,用于运行.class字节码文件或.jar文件。

    javac

    Java编程语言的编译器,将.java的源代码文件编译成.class的字节码文件。

    jar

    创建和管理jar文件

    java程序生成流程

    通过JDK将java源代码文件生成并运行Java程序,需要经过编译和运行。

    1. 编译:是指使用Java编译器(javac)将java源代码文件(.java文件)编译为.class的字节码文件。
    2. 运行:是指在Java虚拟机上执行字节码文件。

    JDK常用工具选项

    javac编译选项

    javac编译的命令格式为:javac [options] [sourcefiles] [classes] [@argfiles]

    其中:

    options :命令选项。

    sourcefiles :一个或多个需要编译的源文件。

    classes :一个或多个要为注释处理的类。

    @argfiles :一个或多个列出选项和源文件的文件。这些文件中不允许有-J选项。

    javac是java编译器,其 options 参数取值很多,但有些大部分并不常用,常用的 options 取值如表3所示。

    表 3 javac常用的编译选项

    options取值

    说明

    示例

    -d path

    指定存放生成的类文件的路径

    默认情况下,编译生成的类文件与源文件在同一路径下。使用-d选项可以将类文件输出到指定路径。

    #使用-d选项将所有类文件输出到bin路径下

    javac /src/*.java -d /bin

    -s path

    指定存放生成的源文件的路径

    -

    -cp path或-classpath path

    搜索编译所需的class文件,指出编译所用到的class文件的位置。

    #在Demo中要调用GetStringDemo类中的getLine()方法,而GetStringDemo类编译后的文件,即.class文件在bin目录下。

    javac -cp bin Demo.java -d bin

    -verbose

    输出关于编译器正在执行的操作的消息,如加载的类信息和编译的源文件信息。

    #输出关于编译器正在执行的操作的消息。

    javac -verbose -cp bin Demo.java

    -source sourceversion

    指定查找输入源文件的位置。

    -

    -sourcepath path

    用于搜索编译所需的源文件(即java文件),指定要搜索的源文件的位置,如jar、zip或其他包含java文件的目录。

    -

    -target targetversion

    生成特定JVM版本的类文件。取值为1.1,1.2,1.3,1.4,1.5(或5),1.6(或6),1.7(或7),1.8(或8)。targetversion的默认取值与-source选项的sourceversion有关。sourceversion取值:

    • 1.2,targetversion为1.4;
    • 1.3,targetversion为1.4;
    • 1.5、1.6、1.7、未指定,targetversion为1.8。
    • 其他值,targetversionsourceversion取值相同。

    -

    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常用的运行选项

    options取值

    说明

    示例

    -cp path或-classpath path

    指定要运行的文件所在的位置以及需要用到的类路径,包括jar、zip和class文件目录。

    当路径有多个时,使用“:”分隔。

    -

    -verbose

    输出关于编译器正在执行的操作的消息,如加载的类信息和编译的源文件信息。

    #输出关于编译器正在执行的操作的消息。

    java -verbose -cp bin Demo.java

    jar打包选项

    jar的命令格式为:jar {c | t | x | u}[vfm0M] [jarfile] [manifest] [-C dir] file...

    jar命令参数说明如表5所示。

    表 5 jar命令参数说明

    参数

    说明

    示例

    c

    创建jar文件包。

    #把当前目录的hello.class文件打包到Hello.jar,且不显示打包的过程。如果Hello.jar文件还不存在,就创建它,否则首先清空它。

    jar cf Hello.jar hello.class

    t

    列出jar文件包的内容列表。

    #列出Hello.jar包含的文件清单。

    jar tf Hello.jar

    x

    展开jar文件包的指定文件或者所有文件。

    #解压Hello.jar 到当前目录,不显示任何信息。

    jar xf Hello.jar

    u

    更新已存在的jar文件包,如添加文件到jar文件包中。

    -

    v

    生成详细报告并打印到标准输出。

    #把当前目录的hello.class文件打包到Hello.jar,并显示打包的过程。如果Hello.jar文件还不存在,就创建它,否则首先清空它。

    jar cvf Hello.jar hello.class

    f

    指定jar文件名,通常这个参数是必须的。

    -

    m

    指定需要包含的manifest清单文件。

    -

    0

    只存储,不压缩,这样产生的jar文件包会比不用该参数产生的体积大,但速度更快。

    -

    M

    不产生所有项的manifest清单文件,此参数会忽略m参数。

    #把当前目录的hello.class文件打包到Hello.jar,并显示打包的过程。如果Hello.jar文件还不存在,就创建它,否则首先清空它。但在创建Hello.jar时不产生manifest 文件。

    jar cvfM Hello.jar hello.class

    jarfile

    .jar文件包,它是f参数的附属参数。

    -

    manifest

    .mf的manifest清单文件,它是m参数的附属参数。

    -

    -C dir

    转到指定dir下执行jar命令,只能配合参数c、t使用。

    -

    file

    指定文件/路径列表,文件或路径下的所有文件(包括递归路径下的)都会被打入jar文件包中,或解压jar文件到路径下。

    #把当前目录的所有class文件打包到Hello.jar,并显示打包的过程。如果Hello.jar文件还不存在,就创建它,否则首先清空它。

    jar cvf Hello.jar *.class

    类库

    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程序示例

    1. cd到代码目录,此处以用户“~/code”进行举例。如下所示:

      $ cd ~/code 
      
    2. 编写Hello World程序,保存为HelloWorld.java,此处以编译Hello World程序进行举例说明。示例如下:

      $ vi HelloWorld.java
      

      代码内容示例:

      public class HelloWorld {     
           public static void main(String[] args) {         
               System.out.println("Hello World");     
            } 
      }
      
    3. 在代码目录,执行编译,使用命令:

      $ javac HelloWorld.java 
      

      编译执行未报错,表明执行通过。

    4. 编译完成后,会生成 HelloWorld.class 文件,通过java命令可执行查看结果,示例如下:

      $ java HelloWorld
      Hello World
      

    编译带包的java程序示例

    1. 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
      
    2. 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();
        }
      }
      
    3. 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.");
        }
      }
      
    4. cd到~/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.");
        }
      }
      
    5. 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文件。

    6. cd到~/code,使用java运行Test程序。

      $ cd ~/code
      $ java -classpath Test:Hello:Hi my/example/Test
      

      执行结果如下所示:

      Hello, openEuler.
      Hi, the global developers.
      

    文档捉虫

    “有虫”文档片段

    问题描述

    提交类型 issue

    有点复杂...

    找人问问吧。

    PR

    小问题,全程线上修改...

    一键搞定!

    问题类型
    规范和低错类

    ● 错别字或拼写错误;标点符号使用错误;

    ● 链接错误、空单元格、格式错误;

    ● 英文中包含中文字符;

    ● 界面和描述不一致,但不影响操作;

    ● 表述不通顺,但不影响理解;

    ● 版本号不匹配:如软件包名称、界面版本号;

    易用性

    ● 关键步骤错误或缺失,无法指导用户完成任务;

    ● 缺少必要的前提条件、注意事项等;

    ● 图形、表格、文字等晦涩难懂;

    ● 逻辑不清晰,该分类、分项、分步骤的没有给出;

    正确性

    ● 技术原理、功能、规格等描述和软件不一致,存在错误;

    ● 原理图、架构图等存在错误;

    ● 命令、命令参数等错误;

    ● 代码片段错误;

    ● 命令无法完成对应功能;

    ● 界面错误,无法指导操作;

    风险提示

    ● 对重要数据或系统存在风险的操作,缺少安全提示;

    内容合规

    ● 违反法律法规,涉及政治、领土主权等敏感词;

    ● 内容侵权;

    您对文档的总体满意度

    非常不满意
    非常满意
    提交
    根据您的反馈,会自动生成issue模板。您只需点击按钮,创建issue即可。
    文档捉虫
    编组 3备份