; 一 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运行时不打开控制台窗口 在J SE/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 lishixinzhi/Article/program/Java/hx/201311/26520
其中,Yippee是类名,public是它的修饰符,每个java文件中,最多可以有一个public的类,且这个类的名称要和java文件名一样。
main方法,是java程序的入口,String[] args,是它的参数,一个字符串数组。一楼的兄弟的说法是错误的。他运行没有结果,是因为这个程序他应该是在IDE工具中运行的,运行时,工具会自己给这个方法传入一个空数组的,数组长度为0,所以没有进去for循环,当然就没有结果了。
但是,如果你在命令行(windows系统的cmd)中运行,它就会让你输入一组参数,那时候就可以看到运行的结果了。
以上就是关于打造java启动器步骤三全部的内容,包括:打造java启动器步骤三、java的主程序入口,参数、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)