- 浏览: 844571 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (530)
- Java编程 (64)
- C/C++/D (6)
- .Net/C# (9)
- Ruby (12)
- JavaScript (77)
- XML (1)
- JSON (1)
- Ajax (17)
- ExtJs (81)
- YUI (1)
- JQuery (7)
- DWR (1)
- HTML (7)
- CSS (7)
- Database (6)
- PowerDesigner (23)
- DB2 (2)
- Oracle (57)
- MS SQL Server (8)
- MySQL (6)
- JSP/Servlet/JSTL/TagLib (3)
- Spring (1)
- Hibernate (0)
- iText (0)
- Struts (0)
- Struts2 (0)
- iReport (0)
- FreeMarker (0)
- HttpClient (1)
- POI (6)
- FckEditor (15)
- Eclipse / MyEclipse (10)
- IntelliJ IDEA (0)
- NetBeans (0)
- Tomcat (11)
- WebLogic (1)
- Jboss (3)
- jetty (4)
- IIS (2)
- CVS/VSS (1)
- FTP (1)
- Windows/DOS (6)
- Linux/Unix (0)
- 软件建模 UML (0)
- Design Pattern & Thinking In Programming (10)
- 数据结构与算法 (12)
- 软件项目管理 (9)
- 行业应用解决方案 (3)
- 电脑软件与故障解决 (13)
- 编程语言 (1)
- 十万个为什么 (3)
- JBPM (2)
- sysbase (2)
- JDBC (8)
- Ant (2)
- Case-计算机辅助软件工程 (1)
- WebService (4)
- 浏览器 (1)
最新评论
-
gaoqiangjava:
同一楼,还请大手帮解决
JAVA读取word文件 -
hyl523:
// 判断数组中的第一个值是否未定义,如果未定义,便定义为空对 ...
javascript面向对象之二 命名空间 -
ping12132200:
ping12132200 写道我抱着个错不是因为:body标签 ...
extjs在IE报对象不支持此属性或方法 -
ping12132200:
我抱着个错不是因为:body标签内的第一个元素不能为文本tex ...
extjs在IE报对象不支持此属性或方法 -
fireinjava:
呀,不错,转走了,谢谢啦~
利用OpenOffice将word转换成PDF
一、概述
现在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
发表评论
-
java调用dll方法
2011-06-02 21:56 1601Java语言本身具有跨平台性,如果通过Java调用DLL的技术 ... -
DIV+CSS
2011-05-31 13:07 901http://www.divcss5.com/ -
getWriter() has already been called for this response的解决办法
2011-05-30 14:15 3714Servlet规范说明,不能既调用 response.getO ... -
CVS客户端
2011-05-27 14:54 916http://www.syntevo.com/index.ht ... -
UML工具
2011-05-25 18:59 898http://www.umlchina.com/Tools/N ... -
applicationcontext.xml怎么分模块简化配置?
2011-05-22 18:02 2250(1) 在用spring做项止的时候,我们经常会在appli ... -
Struts1.2分模块后的路径问题
2011-05-22 18:00 16131.某项目分模块的web.xml配置如下: <i ... -
java API chm html 1.5 1.6 中文版英文版 帮助文档
2011-05-14 10:45 2677J2SE DK & API下载 ————————- h ... -
ClientAbortException原因探究
2010-12-23 16:17 1878WEB是部署在TOMCAT5.5.17下面的,采用JNDI链接 ... -
java游戏 http://blog.csdn.net/cping1982/archive/2009/06/10/4258704.aspx
2010-11-08 22:31 1268http://blog.csdn.net/cping1982/ ... -
Java中字符串(String)的存储和赋值原理
2010-11-08 22:14 1232可能很多java的初学者对String的存储和赋值有迷惑, ... -
Java中字符串的最大长度
2010-11-08 22:12 1320在cpp中为了可移植性,string的长度是string::s ... -
Java与XML联合编程之DOM篇
2010-10-06 13:37 894一、DOM初步 DOM是Document Object ... -
jexl解析表达式字符串
2010-10-06 11:44 1959网址:http://commons.apache.org/je ... -
Java中getResourceAsStream的用法
2010-10-06 11:31 2013Java中getResourceAsStream的用法 首先 ... -
Class.getResourceAsStream 和 ClassLoader.getResourceAsStream
2010-10-06 11:08 859Class.getResourceAsStream 和 Cla ... -
利用第三方的Jar包内的类和方法来判别文件编码
2010-08-06 13:07 1790今天在论坛里看见了一个人发帖子问,如何查看文件的编码。有一个人 ... -
将Java程序作成exe文件的几种方法
2010-08-06 13:04 969看到网上有同志的介绍将Java程序作成exe文件的方法,写的不 ... -
Java基本类型转换总结
2010-07-26 19:49 1393数值型转换成字符型 // 基本数据类型, int i_a ... -
怎样不使用中间变量来交换两个变量的值?
2010-07-10 21:39 1525int 的话就+后再减.string 的话就连接再截取. ...
相关推荐
将Java程序转换为Windows服务是通过JavaService工具实现的,这个工具允许Java应用程序在Windows操作系统中作为服务运行,从而在系统启动时自动启动程序,并且可以在服务管理器中进行管理。下面将详细讲解如何操作和...
本文将详细介绍如何利用Java Service Wrapper工具将Java程序转换为Windows服务运行的过程。 #### Java Service Wrapper简介 Java Service Wrapper是一款开源工具,用于将任何Java应用程序封装成一个Windows服务...
然而,为了实现自动化启动和后台运行,我们可以将Java程序转换为Windows服务。这个过程涉及到几个关键步骤和技术,包括使用特定的工具来包装Java程序并将其注册为系统服务。下面将详细阐述如何实现这一目标。 首先...
它能够将任何可执行文件转换为Windows服务,这样程序就可以在系统启动时自动运行,并在用户登录或注销时保持活动状态。 2. **安装Winsw** 首先,你需要从Winsw的GitHub仓库下载适用于你的Java环境的Winsw版本,...
Java Service Wrapper工具是一款用于将Java应用程序转换为操作系统服务的实用工具,特别适用于Windows环境。它使得Java程序能够像系统服务一样启动、停止,并且在系统启动时自动运行,提供了更稳定的运行环境和管理...
通过以上步骤,你可以成功地将一个Java程序转换为Windows服务,使其能够高效、稳定地在后台运行。这个过程涉及到了Java应用程序的封装、Windows服务的管理和配置,以及日志记录等多个方面的知识,对于Java开发者来说...
通过使用JSmooth,开发者可以轻松地将Java程序转化为Windows可执行文件,从而简化部署过程,提高用户友好性。但是需要注意,这种方法并不适用于所有情况,例如大型复杂的Java应用,可能需要更专业的解决方案,如...
以下是使用JSW将Java程序转换为Windows服务的基本步骤: 1. **下载并安装JSW**: 从JSW官方网站获取最新版本的JSW,并按照指南进行安装。通常,这涉及到解压文件到指定目录。 2. **配置JSW**: 在JSW的安装目录下,...
这个工具使得开发者可以轻松地将Java程序转换为Windows服务,使其能够在系统启动时自动启动,并在后台持续运行,即使没有用户登录也可以保持活动状态。这对于需要长期运行或者需要在特定系统环境下稳定运行的Java...
JavaService-2.0.10 将Java程序转换为Windows服务,使得Java应用能够享受到这些服务特性。这包括但不限于自动启动、依赖管理、权限控制以及远程管理等。通过使用这个工具,开发者可以避免手动编写批处理脚本或配置...
在IT行业中,将Java应用程序转换为Windows服务是一个常见的需求,特别是在需要后台自动运行或系统启动时自动启动的应用程序场景中。下面将详细解释这个过程,以及如何利用给定的文件来实现这一目标。 首先,我们要...
这篇文档将详细解释如何使用Wrapper将Java项目转换为Windows服务。 一、什么是Java Service Wrapper? Java Service Wrapper是一个开源工具,允许Java应用程序在不同的操作系统(包括Windows)上作为本地服务运行。...
### 使用Wrapper将Java程序注册为Windows的服务 #### 一、概述 在Windows系统中,将Java应用程序注册为系统服务能够实现程序的后台自动运行,并在系统启动时自动启动该程序,这对于服务器应用尤为关键。本文将详细...
《将Java程序转换为Windows服务:Wrapper Windows x86-32 3.5.29详解》 在IT行业中,经常会遇到需要在Windows系统上持续运行Java应用程序的情况,这时,将Java程序转换为Windows服务就显得尤为重要。Wrapper工具,...
Wrapper是一个第三方软件,它允许我们将Java应用转换为Windows服务,确保程序在系统启动时自动运行,并具备后台服务的所有特性。 **Wrapper是什么?** Wrapper是一个轻量级的程序,它能够作为一个容器,将Java应用...
为了解决这个问题,开发者可以将Java程序转换成可执行的Windows程序(.EXE文件),使其可以直接在没有Java环境的计算机上运行。本文将详细探讨如何利用JSmooth工具将Java程序转换成.exe文件。 首先,我们需要了解...
使用nssm32.exe将Java应用程序转换为服务的步骤如下: 1. **下载与安装**:首先,你需要从nssm的官方网站或其他可信源下载nssm-2.24版本。这个版本包含了nssm32.exe,以及相关的帮助文档和示例。 2. **配置服务**...
以下是使用exe4j进行Java程序转换为.exe程序的步骤: 1. **安装exe4j**:首先,你需要下载exe4j的安装文件,如提供的`exe4j_windows-x64_6_0_2.exe`或`exe4j_windows_6_0_2.exe`,根据你的系统选择合适的版本进行...
将Java应用程序转换为exe文件是跨平台开发中的一个重要环节,尤其是对于Windows用户而言,exe文件的执行无需安装Java运行环境,极大地提升了应用的便捷性和用户接受度。本文将详细介绍将Java应用程序(通常为JAR文件...