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”.

来源:

:

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

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

(0)
上一篇 2022年7月8日 下午12:16
下一篇 2022年7月8日 下午12:36


相关推荐

  • 腾讯云的ssl免费证书申请_工程资质证书怎么办理

    腾讯云的ssl免费证书申请_工程资质证书怎么办理申请腾讯云SSL证书流程腾讯云SSL证书免费申请地址:https://cloud.tencent.com/document/product/400/8422按照引导完成实名认证之后点击申请免费证书填写必填项选择验证方式使用腾讯云可以选择手动DNS验证,其余选择文件验证,此处以文件验证为例登录服务器创建验证文件,在网站根目录下,创建指定的文件。该文件包括文件目录、文件名、文件内容。以LINUX服务器为例子,linux目录下有个目录:/var/www/html,把文件

    2025年10月13日
    1
  • Java爬虫系列二:使用HttpClient抓取页面HTML

    爬虫要想爬取需要的信息,首先第一步就要抓取到页面html内容,然后对html进行分析,获取想要的内容。上一篇随笔《Java爬虫系列一:写在开始前》中提到了HttpClient可以抓取页面内容。今天就

    2022年2月16日
    41
  • 解读非主流_所谓的非主流

    解读非主流_所谓的非主流解读非主流——当非主流成为主流互联网上非主流信息以几何级数倍增,作为非主流信息集聚载体的网站的建设者的我们——站长,该如何应对呢?如何适应这种大环境大气候的变化呢?《谁动了我的奶酪》告诉我们,要感觉良好,就好主动变化,而非被动挨打。全面投入非主流《——》主流的管道建设,实在是当务之急,也是有利可图的聪明人做的事情。下面就从主流的角度,解读下非主流…

    2022年10月17日
    5
  • 什么是服务降级?「建议收藏」

    什么是服务降级?「建议收藏」服务降级,当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。服务降级方式:服务接口拒绝服务:无用户特定信息,页面能访问,但是添加删除提示服务器繁忙。页面内容也可在Varnish或CDN内获取。 页面拒绝服务:页面提示由于服务繁忙此服务暂停。跳转到varnish或nginx的一个静态页面。

    2022年6月3日
    86
  • oracle dmp导入导出_oracle导出数据

    oracle dmp导入导出_oracle导出数据Oracle数据导入导出imp/exp就相当于oracle数据还原与备份。exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命令可以把dmp文件从本地导入到远处的数据库服务器中。利用这个功能可以构建两个相同的数据库,一个用来测试,一个用来正式使用……Oracle数据导入导出imp/exp就相当于oracle数据还原与备份。exp命令可以把数据从远程数据库服务器导出到本地的dmp…

    2025年6月28日
    6
  • 中国互联网金融协会发布《关于OpenClaw在互联网金融行业

    中国互联网金融协会发布《关于OpenClaw在互联网金融行业

    2026年3月15日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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