长期支持版本

    社区创新版本

      使用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. ~/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备份