`
liss
  • 浏览: 826810 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

将Java程序转换为Windows服务

阅读更多

一、概述

    现在Java语言越来越受到程序员的关注。和Java相关的应用也越来越多。虽然Java是跨平台语言,但在国内有很多的应用都是运行在Windows下的。尤其是一些服务类程序。而一般基于Java的服务类程序都是以控制台方式运行的。这样虽然很直接。但如果服务程序多了,显得很乱。而且要使其在系统启动时运行也比较麻烦。因此,本文将介绍一种可以将Java程序转换为Windows服务的方法。通过这种方法。可以使Java程序象Windows服务程序一样运行。下面就让我们来进行转换吧。

    一般有两种方法可以将Java程序转换为Windows服务:

    1. 使用Windows服务直接在同一个进程运行Java应用程序。(这种方法服务程序无法更好地控制Java程序)。

    2. 在Windows服务程序中建立一个java虚拟机实例(JVM),这个JVM实例和服务程序在同一个上下文中,而且JVM在Windows服务程序的控制之下。

    第一种方法虽然实现起来简单,但这种方法不能很好地控制Java程序。因此,本文使用了第二种方法来运行Java程序。本文将带领读者一步一步地实现所有的内核代码。在实现代码之前,我们需要很好地了解Windows服务和Java本地接口(JNI)的概念和API的使用。

二、使用JVM API模拟Java运行时

    由于Windows任务管理器将所有的Java进程都显示为"Java",因此,我们根本无法通过这种方式区分某一个Java进程。为了给每一个Java应用程序指定一个特殊的名子。我们需要使用JVM API来模拟Java运行时。

    下面先来看看Java运行时(也就是java.exe)在运行时需要些什么。当我们使用java <类名>来运行java程序时,java.exe从系统路径动态装载了一些DLL库。这些Dll如下:

 
1.       java\jdk\jre\bin\client\jvm.dll
这个dll提供了JVM所需要的API。一但我们建立了一个JVM,jvm.dll就会依次装载所需的Dll,这些Dll如下:


2. java\jdk\jre\bin\hpi.dll
3. java\jdk\jre\bin\verify.dll
4. java\jdk\jre\bin\java.dll
5. java\jdk\jre\bin\zip.dll

    下面是java.exe如何处理Dll的过程:
 
1. 装载JVM Dll。
2. 建立一个JVM。
3. 装载指定的Java类。
4. 调用main方法,也就是public static void main (String[] args)。

我们可以使用在jni.h中定义的JNI_CreateJavaVM方法来建立一个JVM实例。我们可
以在JDK的安装目录中找到jni.h。
 
    下面是一个简单的Java程序,在控制台中打印出"Hello World"。

 

下面是使用JNI来模拟java.exe的例子代码。在这里我们使用动态装载jvm.dll方法,而不是静态绑定jvm.lib。这样会更有弹性,如可以自由地选择java的版本。代码如下:
 
int InvokeMain() {
       JavaVM *vm;
       JavaVMInitArgs vm_args;
       JavaVMOption options[1];
       jint res;
       JNIEnv *env;
       jclass cls;
       jmethodID mid;
 
       options[0].optionString = CLASS_PATH;
       vm_args.version = JNI_VERSION_1_4;   // 设置JDK的版本
       vm_args.options = options;
       vm_args.nOptions = 1;
       vm_args.ignoreUnrecognized = JNI_FALSE;
 
       //装载jvm.dll
       HINSTANCE handle = LoadLibrary(RUNTIME_DLL);
       if( handle == 0) {
              printf("Failed to load jvm dll %s\n",
                     RUNTIME_DLL);
              return -1;
       }
    // 得到JNI_CreateJVM指针


       createJVM = (CreateJavaVM)GetProcAddress(handle,
                     "JNI_CreateJavaVM");
 
       res = createJVM(&vm, (void **)&env, &vm_args);
       if (res < 0) {
              printf("Error creating JVM");
              return -1;
       }
 
       // 装载指定的类
       cls = env->FindClass(CLASS_NAME);
       if(cls == 0) {
              printf("Exception in thread \"main\"
                     java.lang.NoClassDefFoundError: %s\n",
                            CLASS_NAME);
              return -1;
       }
       //得到main方法
       mid = env->GetStaticMethodID(cls, "main",
              "([Ljava/lang/String;)V");
       if(mid == 0) {
              printf("Exception in thread \"main\"
                     java.lang.NoSuchMethodError: main\n");
              return -1;
       }
 
    // 调用main方法(不传递参数)
       env->CallStaticVoidMethod(cls, mid, 0);
    // 如果程序抛出异常,打印它
       if(env->ExceptionCheck()) {
              env->ExceptionDescribe();
              return -1;
       }
       return 0;
}

    在装载com.test.Hello时,我们必须使用"/"分割符(如com/test/Hello)。还有我们需要理解JNI调用Java方法的格式。如,为了调用void main(String[] args)方法,格式为:([Ljava/lang/String;)V:,"["表示数组;"L<classname>;"描述一个Java对象,V表示这个方法返回void。我们可以从JNI规范得到更多的细节。本文不再详细描述。

 

package com.test;
public class Hello{
public static void main(String[] args) {
System.out.println("Hello World");
}
}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/javaokay/archive/2008/03/12/2173669.aspx

分享到:
评论

相关推荐

    使用JavaService把Java程序转换成windows服务

    使用JavaService把Java程序转换成windows服务

    Java程序快速转换为windows服务运行

    Java程序快速转换为windows服务运行

    Java打包程序转换为 windows exe

    经常有需要将Java程序部署到Windows上面运行,以上软件可以转换为exe

    Java Service Wrapper工具把Java程序转换为Windows服务

    NULL 博文链接:https://xbgd.iteye.com/blog/754948

    java程序转exe工具

    可以将java程序转换成exe程序,设置图标、启动参数,或者将java程序配置成windows服务。类似eclipse

    exe4j (java程序转换成.exe)

    如何将写好的java程序轻松的脱离jre而移植到windows平台,这是个很好的软件,只要用java写好程序,就可以转换成.exe的windows平台的app

    Java程序转换成exe-exe4j-windows64位

    可以把java程序包装成exe可执行文件,windows64位版本

    java Socket实现聊天程序

    当用户发送聊天信息时,服务端将会收到客户端用Socket传输过来的聊天信息对象,然后将其强制转换为Chat对象,并将本次用户的聊天信息对象添加到聊天对象集Message中,以供所有聊天用户访问。 接收用户的聊天信息是由...

    JAVA程序将amr文件转换为mp3文件

    使用java代码将amr文件转换为MP3文件,本jar包只支持linux平台, windows平台需要单独下载ffmpeg.exe文件,地址:http://ffmpeg.org/download.html

    64位WindowsJava转换为exe文件.zip

    exe4j帮助集成Java应用程序到Windows操作环境的java可执行文件生成工具,无论是用于服务器,还是图形用户界面(GUI)或命令行的应用程序。exe4j帮助以一种安全的方式启动java应用程序,来显示本地启动画面,检测及...

    Java聊天室程序源码(毕业设计)

    当用户发送聊天信息时,服务端将会收到客户端用Socket传输过来的聊天信息对象,然后将其强制转换为Chat对象,并将本次用户的聊天信息对象添加到聊天对象集Message中,以供所有聊天用户访问。 接收用户的聊天信息是由...

    java程序转.exe转换器

    将java生成的程序制作成windows桌面的.exe程序,非常方便,不用安装,安装步骤走下来,最后就会生成exe程序,双击可运行,希望对大家有帮助,谢谢!

    巧用Java程序把Word转换成Html文件

    Jacob是Java和Windows下的Com桥,通过它我们可以在Java程序中调用COM组件。如果你的JDK是1.4,那你需要下载Jacob1.9的jni库才能正常运行,早期版本在JDK1.4下有些问题。

    documents4j,documents4j是一个java库,用于将文档转换为另一种文档格式.zip

    documents4j是一个用于将文档转换为其他文档格式的java库。这是通过将转换委托给任何本机应用程序来实现的,这些应用程序能够理解将给定文件转换为所需目标格式的过程。documents4j附带了对ms-word和ms-excel for ...

    使用swig将C代码转为JAVA接口的例子(Win10平台)

    配置环境变量JAVA_BIN和JAVA_INCLUDE。比如: JAVA_BIN:C:\Program Files\Java\jdk-12.0.2\bin JAVA_INCLUDE:C:\Program Files\Java\jdk-12.0.2\include 进入Examples\java\simple目录,用VS2019打开example.dsp。...

    java文件转换exe可执行

    4. 生成的“Windows NT 服务”支持暂停/继续,并且有事件触发 Java 程序。 5. 生成的“Windows NT 服务”类型的可执行文件自带安装和卸载服务功能。 6. 能对 class 文件进行加密保护,使无法通过对 exe 解压得到 ...

    windows 程序设计

    连结程序使用该信息在.EXE文件中建立一个表格,在加载程序时,Windows使用它将呼叫转换为Windows函数。 WINDOWS程序设计选项 为说明Windows程序设计的多种技术,本书提供了许多范例程序。这些程序使用C语言撰写并...

    java源码包---java 源码 大量 实例

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM...

    java源码包3

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    Java2Cpp-Translator:应用程序将Java源代码转换为C ++源代码-java source code

    Java2Cpp转换器 应用程序将Java源代码转换为C ++源代码。

Global site tag (gtag.js) - Google Analytics