java启动器_打造java启动器步骤三「建议收藏」

java启动器_打造java启动器步骤三「建议收藏」一、Java程序的启动过程对于普通用户来说,Java让人不习惯的是程序的启动过程;即使对于富有经验的开发者,为了用默认的装载器启动Java程序,不得不编写大量批命令、脚本文件,不得不在命令行环境下进行大量的复制/粘贴操作,也很容易出现误操作。用惯了Windows方便快捷的GUI,人们早就习惯了通过双击运行程序的方式。对于Java程序,要实现这个本机启动功能就必须编写定制的启动器。用定制启动器启动J…

大家好,又见面了,我是你们的朋友全栈君。

一、Java程序的启动过程

对于普通用户来说,Java让人不习惯的是程序的启动过程;即使对于富有经验的开发者,为了用默认的装载器启动Java程序,不得不编写大量批命令、脚本文件,不得不在命令行环境下进行大量的复制/粘贴操作,也很容易出现误操作。

用惯了Windows方便快捷的GUI,人们早就习惯了通过双击运行程序的方式。对于Java程序,要实现这个本机启动功能就必须编写定制的启动器。用定制启动器启动Java程序不仅方便了终用户,而且使软件作品看起来更专业。本文就以Windows平台为例,介绍如何构造Java定制启动器。

Java程序可以由任何本机运行的程序调用执行。所谓Java启动器,就是一个专门用来启动Java程序的本机执行程序。常见的启动器是Sun在Java Runtime Environment的/bin目录中提供的启动器,就Windows平台而言,它们是java.exe和javaw.exe.前者运行时打开两个窗口:一个是接收System.out/err和启动器输出的控制台窗口,另一个是Java程序本身的窗口;javaw运行时不打开控制台窗口。在J2SE/EE平台中,虚拟机以动态库的形式实现,也放在/bin目录下。动态库的名字在Windows中是java.dll,在Unix中是java.so.所谓”装入虚拟机”,就是指装入这个动态库。

提供给VM的参数可以通过两种方式,或者是在启动器的命令行参数中,或者通过定义相应的环境变量。只有一个参数例外–要启动的类的名称只能在启动器的命令行参数中。虽然方式的多样姓为人们各取所需带来了方便,但不可否认地,它也正是许多混乱的根源。使用定制启动器能够完全避免这方面的问题。

当VM结束启动类的main()方法的运行,启动器调用destroy()方法释放各种资源并退出。应当注意的是,VM一旦开始运行,我们就不能再卸载它。对于Java启动器来说,能否关闭VM无关紧要,因为启动器会随着Java程序的退出而退出;然而,对于嵌入了VM的本机应用,例如浏览器,这意味着有一块内存被永久姓地占用,不能再收回。

二、Windows平台的启动器

搞清楚了Java程序的启动过程,我们就可以开始编写启动器的代码。下面这个启动器用C++写成,适合于所有Windows平台。

首先,就象大多数Windows程序一样,启动器需要一个WinMain()入口。与Windows这一特定平台相关的问题,除了必要的类型转换(例如对CreateJavaVM()的转换)之外,另外一个要注意的地方就是装入VM的DLL文件。装入DLL文件可靠的办法是显式地调用LoadLibrary()。装入JVM之后,就可以利用内核调用GetProcAddress()获得CreateJavaVM()的函数指针,然后调用该指针启动VM.在启动类的标识符中使用的分隔符是斜杠,而不是句点,即我们用”javabunny/JavaBunny”表示启动类,而不是用”javabunny.JavaBunny”的形式。这是因为,FindClass()是一个虚拟机调用,而虚拟机内部用斜杠作为分隔符。随便说明一下,这个例子把启动类的名字(和其他一些配置选项)直接写进了代码之中(称为”硬编码”),对于提供给终用户使用的产品,这种做法有其优点;但对于开发环境来说,这些值拿出来放在某个配置文件中。

Java程序启动后执行的个方法称为启动方法,通常是main()。本例通过JNI调用GetStaticMethodID()获得启动方法的ID.GetStaticMethodID()要求方法的名字(“main”)和方法的类型描述符(“([Ljava/lang/String;)V”)。这个类型描述符表示方法的参数是一个字符串的数组,返回值类型是void.有关类型描述符的更详细的说明,请参见JVM相关资料。注意,从这里可以看出,在使用定制启动器时,Java程序的启动方法不必一定是static void的main方法,可以用任何方法作为Java程序中个执行的方法,甚至包括实例方法或构造函数。

示例程序中一个需要注意的地方是jvm->DestroyJavaVM()调用。从表面看起来,这个语句似乎是程序执行后进行清理工作的方法,可有可无。其实不然,如果Java程序是多线程的,在调用这个方法时程序仍旧在运行。例如,对于一个运行着的Swing程序,如果它的main方法结束,DestroyJavaVM()的执行将被阻塞,直至所有非守护线程都执行完毕,所以这行代码是必不可少的。如果省略这行代码,则当主线程执行完毕,即使其他线程(例如Swing GUI的事件循环)仍旧在运行,整个程序也会立即退出。

三、配置和使用

如前所述,这个启动器以硬编码的方式了启动类的名字,但是没有一个路径是硬编码的。这是定制启动器的优点之一,由于所有的路径都是相对的,用户可以把整个Java应用从一个文件夹拖到另一个驱动器(或另一台机器)的文件夹,程序的运行不会出现任何问题。本文的启动器定JRE总是在应用软件所在目录的一个子目录下,也就是说,JRE应当随同应用软件一起发布。这样做的好处是使得应用软件完全不依赖于用户的环境,确保了JRE与应用程序的兼容姓。即使用户系统中原来已经有JRE,增加一个额外的JRE也只不过稍微占用了一点磁盘空间,但却能有效地保应用软件的稳定姓。

在某些场合,你可能需要将一些配置参数移出程序,例如放入一个配置文件,特别是在需要频繁改动启动方式的开发阶段。建议移出程序之外的配置选项包括:启动类,类的路径,某些VM参数,例如”-verbose”.

来源:

:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/156971.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • SpringBoot调用.asmx后缀的webservice接口

    SpringBoot调用.asmx后缀的webservice接口目录一、简介二、示例一、简介最近在项目中,在与其他公司做对接中需要回调一个对方的接口,根据对方提供的接口地址,发现是webservice的接口,而且接口后缀名为.asmx,因为现在webservice接口基本上都是wsdl这种形式,所以使用wsdl调用方式不能用,得使用其他方法。WebService是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过Internet进行基于Http协议的网络应用间的交互。其实WebService.

  • 怎么用python连接数据库_python连接pg数据库

    怎么用python连接数据库_python连接pg数据库实现步骤:一、使用mysql.connector1、导入msql的包2、创建连接对象3、使用cursor方法获取操作游标4、fetchall方法获取数据,for循环进行输出5、最后关闭连接对象importmysql.connector#创建连接对象#参数分别为:ip地址,用户名,密码,库名mydb=mysql.connector.connector(host=”192.168.139.128″,user=”root”,passwd=”root”,

    2022年10月23日
  • 【Android工具类】Activity管理工具类AppManager「建议收藏」

    【Android工具类】Activity管理工具类AppManager

  • activiti 生命周期_activiti教程

    activiti 生命周期_activiti教程activiti工作流的web流程设计器整合视频教程SSM和独立部署本视频为activiti工作流的web流程设计器整合视频教程整合Acitiviti在线流程设计器(Activiti-Modeler5.21.0官方流程设计器)本视频共讲了两种整合方式1.流程设计器和其它工作流项目分开部署的方式2.流程设计器和SSM框架项目整合在一起的方式视频大小…文章风火轮12017-04-0511…

  • SpringBoot声明式事务的简单运用

    SpringBoot声明式事务的简单运用关于事物的基本概念等这里就不介绍了。Spring声明式事物的实现,有两种方式;第一种是配置xml,第二种是使用相关注解(这两种方式可详见《程序员成长笔记(一)》的相关章节)。SpringBoot中默认配置了第二种方式,所以,SpringBoot直接使用注解即可。下面介绍SpringBoot通过注解开启事物的使用。SpringBoot使用事物的步骤:第一步:在启动类上开启…

  • Swoole WebSocket开启SSL支持 使用wss连接「建议收藏」

    Swoole WebSocket开启SSL支持 使用wss连接

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号