• java打包成window service服务[转]


    1 解释

          java project  我说的是main方法作为程序入口的java工程,有别于 web project

         这样的工程 一般都是web project的附属扫描程序或一些独立的执行程序,如数据同步程序等。
         把这样的project 要部署到生产机上去运行,这样就涉及到两个问题: 
            1 打包问题,我们一般不会把整个工程文件夹给放上去,一般做法是打一个jar包。
            2 执行问题  最好的做法就是这些main方法程序的工程 对客户来说是透明的 就要求工程 发布成windows 的一个服务。并且设置成一 个自动启动的服务。

    2 java project打包解决方案

          我们做java project 的开发环境一般是Eclipse,这个开发环境本身就提供了把java project 打包成Jar file的功能。
    菜单 File--->Export 选择相应的java project 设置相应的main方法类 按照向导就可以轻松完成。 但这里有一个很大的不足,就是支持这个java project 正常运行的第三方jar包没有被打进来。 这个打成的jar包是不能直接运行的。
          现在实施时,比较常用的解决方案是 依靠第三方的打包插件来实现打包。比较好的开源插件为 fatjar 
          下载地址 http://sourceforge.net/projects/fjep/files
          在eclipse中安装好这个插件后,就可以直接用这个插件进行打包,生成 jar文件。
    命令中运行这个jar文件。如果想执行jar文件,可以使用java命令的-jar选项。例如,你有一个可以运行的myjar.jar文件。因为该文件是可以执行的,所以你可以用如下命令执行之:java -jar myjar.jar 就可以看到执行效果。

    3 java project 的下一站windows服务

         把java project 打成可以执行的jar后,并没有结束。 我们不能要求客户关机再开机的时候 让他们去进行 java -jar java -jar myjar.jar 的命令操作  或 双击可执行jar包的方式来 启动独立运行的java project 程序,我们应该把这个程序的启动做到客户透明化。 可以做的就是开机,开机后,一切业务程序就可以自动运行。

    4 一个windows的服务的解决方案

        比较多的解决方案是 使用 wrapper-windows 这个软件包。这个软件包的强大之处是能把jre环境也给打进去,这个服务可以正常运行在根本没有jre环境即就没有安装JDK的机器上。
        当然我也是比较喜欢 不把jre环境打到服务里的方式,服务程序的运行依靠本机上安装的的jre环境。
            1  下载wrapper-windows-x86-32-3.2.3版本,并解压。里面包含 bin conf doc jdoc lib logs src 7个文件夹。
            2  新建一个文件夹  如 命名为 myWindowServ,在此文件夹下建立 lib bin conf logs application 5个子文件夹。
            3 将 wrapper-windowssrcin 下的
                        App.bat.in
                        InstallApp-NT.bat.in
                        PauseApp-NT.bat.in
                        ResumeApp-NT.bat.in
                       StartApp-NT.bat.in
                       StopApp-NT.bat.in
                       UninstallApp-NT.bat.in
              复制到bin目录下,并将后缀为.in的文件全部重命名,去掉.in。例如: App.bat.in重命名为App.bat,
              并将wrapper-windowsin下的wrapper.exe也复制到bin目录下。
           4 将 wrapper-windowsconf 下的文件复制到myWindowServconf目录下。
           5 将 wrapper-windowslog  下的文件复制到myWindowServlogs目录下。
           6 将 wrapper-windowslib   下的文件复制到myWindowServlib目录下。
           7 将需要安装成服务的java程序打包成jar文件(例如 上面的打包文件 myjar.jar)放到myWindowServapplication下。
           8 配置新文件夹conf目录下的wrapper.conf文件,可以配置运行环境,执行程序,堆内存大小,服务名称等属性信息。
                  这里仅仅列出需要修改和需要注意的地方
                       8.1 找到wrapper.java.command=java
                               如果本机已配置了jre,那么此项不需更改;否则的话,需要将jre复制到myWindowServ文件夹路径下
                            (如和bin在 同一级,修改wrapper.java.command=../jre/bin/java.exe)
                       8.2 指定wrapper的启动方式,用wrapper代理启动不容易出现问题,不然 老报test.Main不存在的异常。
                               wrapper.java.mainclass=org.tanukisoftware.wrapper.test.Main
                               修改成
                               wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
                      8.3  将程序运行需要的jar包都列出来 lib文件夹中的wrapper.jar是必需的
                              wrapper.java.classpath.1=../lib/wrapper.jar
                              wrapper.java.classpath.2=../application/myjar.jar
                      8.4 配置程序运行的所需要的内存大小
                               # Initial Java Heap Size (in MB)
                               #wrapper.java.initmemory=3
                               # Maximum Java Heap Size (in MB)
                               #wrapper.java.maxmemory=64
                              修改成
                              # Initial Java Heap Size (in MB)
                                 wrapper.java.initmemory=128
                              # Maximum Java Heap Size (in MB)
                                 wrapper.java.maxmemory=256
                              这里是限制服务所占用的最小和最大内存,根据程序运行的效果也可以不改。
                      8.5 指定程序的主类  

                             如 com.weiguo.mypro.TimerRun 是 myJar打包工程中main方法所在的类,

                             就需要如下配置:
                              wrapper.app.parameter.1=com.weiguo.mypro.TimerRun

                     以下的一些设置 就是服务本身的属性设置,可以 设置---控制面板--管理工具--服务--随便选中一个服务--右键属性看到。

                      8.6 控制台运行时的名称
                               wrapper.console.title=TestServer
                      8.7 指定服务的名称
                              wrapper.ntservice.name=TestServer
                      8.8  windows服务的显示名称
                              wrapper.ntservice.displayname=TestServer
                      8.9 服务描述
                              wrapper.ntservice.description=TestServer描述
                      8.10 启动模式,默认是自启动AUTO_START or DEMAND_START
                             wrapper.ntservice.starttype=AUTO_START
            9  运行InstallApp-NT.bat安装服务,运行StartApp-NT.bat启动服务。
           10 可以暂停,重启服务 停止服务 PauseApp-NT.bat ResumeApp-NT.bat StopApp-NT.bat
           11 如果要卸载这个服务的话,运行UninstallApp-NT.bat卸载服务。



    另外一个解释

     

    Java Service Wrapper功能很强大,同时支持Windows及Un*x平台,提供三种方式把你的Java程序包装成系统服务,这里只介绍最简单的一种方式,因这种 方式无需对已有的服务程序作任何改变,仅仅增加几个script、配置文件就可以把你的Java服务程序改造成系统服务程序了。
    当然在使用之前需要到 http://wrapper.tanukisoftware.com/doc/english/download.jsp下载 Service Wrapper的发布包。

    下面简单介绍一下具体的使用步骤:
    1.  将下载的Java Service Wrapper包解压到本地,目录为{WRAPPER_HOME};
    2.  服务应用程序名为MyServApp,在目录d:MyServApp下建立bin、conf、logs、lib目录;并把你的已有应用程序如NioBlockingServer.class拷贝到该目录下;
    3.  将{WRAPPER_HOME}srcin下的遗以下文件拷贝到MyServApp目录下,并重命名。
     C: MyServAppinWrapper.exeà{WRAPPER_HOME}inWrapper.exe 
     C:MyServAppinMyApp.batà{WRAPPER_HOME}srcinApp.bat.in
     C:MyServAppinInstallMyApp-NT.batà{WRAPPER_HOME}srcinInstallApp-NT.bat.in
     C:MyServAppinUninstallMyApp-NT.batà{WRAPPER_HOME}srcinUninstallApp-NT.bat.in
    4.  将{WRAPPER_HOME}lib下的以下文件拷贝到C: MyServApp lib目录下
    {WRAPPER_HOME}libWrapper.DLL
    {WRAPPER_HOME}libwrapper.jar
    5.  将{WRAPPER_HOME}srcconfwrapper.conf.in拷贝到C: MyServApp conf目录下并命名为wrapper.conf;并修改wrapper.conf文件,在其中配置您的应用服务。
    主要修改以下几项即可:
    #你的JVM位置:
    wrapper.java.command=D:Sunj2sdk1.4.0_03injava 
    #运行参数:如:
    wrapper.java.additional.1=-Dprogram.name=run.bat
    #classpath:
    wrapper.java.classpath.1=../lib/wrapper.jar
    wrapper.java.classpath.2=../bin/.
    # Java Library Path (location of Wrapper.DLL orlibwrapper.so)
    wrapper.java.library.path.1=../lib
    #MAIN CLASS 此处决定了使用Java Service Wrapper的方式
    wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
    #你的Java应用类
    wrapper.app.parameter.1= NonBlockingServer
    # 服务名
    wrapper.ntservice.name=NB

    # Display name of the service
    wrapper.ntservice.displayname=Nio NonblockingServer
    # 服务描述
    wrapper.ntservice.description=Nio NonblockingServer
    其他的配置根据你的需要改变即可
    6.  对以上配置的MyApp.bat进行测试,运行MyApp.bat,就像在Console窗口下运行Tomcat一样;
    7.  对以上配置的服务进行测试,运行C:MyServAppinInstallMyApp-NT.bat将把你的应用(此处为NioBlockingServer)安装到Win32系统服务中了。
    8.  打开控制面板-管理程序-服务,看到Nio Nonblocking Server已经在系统服务中了,其他用法就与我们熟悉的Windows服务一样了。

    Tomcat使用的是Java Service Wrapper模式二,这种方式需要对已有的程序进行小的改动,但可以通过Socket端口的方式控制服务程序核心的启动,更加灵活。Java Service Wrapper提供的模式三比较复杂,需要作出更多的编码,我没有研究。
    采用模式一,即可简单有效的把我们的服务程序包装成为系统服务程序,并增强了日志功能,我们可以把MyServApp的几个文件做成模板,每次修改文件名,配置文件就可以了,有精力的朋友更可以做成Eclipse的plugin,鼠标点点就把应用配成服务了。

    追问:

    刚才我也下了个wrapper-windows-x86-32-3.2.3.zip  说下具体用法行吗?

    InstallTestWrapper-NT.bat执行这个可以成功安装,

    UninstallTestWrapper-NT.bat执行这个可以成功卸载。

    但是怎么把Test Wrapper Sample Application服务换成我写的java程序呢?

    求具体方法。。。。求指教!

    回答:
    并把你的已有应用程序如NioBlockingServer.class拷贝到该目录下
    追问:

    wrapper.exe <command> <configuration file> [configuration properties] [...]
    wrapper.exe <configuration file> [configuration properties] [...]
       (<command> implicitly '-c')
    wrapper.exe <command>
       (<configuration file> implicitly 'wrapper.conf')
    wrapper.exe
       (<command> implicitly '-c' and <configuration file> 'wrapper.conf')

    这个命令有什么用?

    追问:

    装完的服务,可执行文件的路径是这个

    C:WRAPPER_HOMEinwrapper.exe -s C:WRAPPER_HOMEconfwrapper.conf

    比如我想改成c:123.exe

    要怎么改呢!

    回答:
    1.   准备工具

    首先下载Java Service Wrapper

     

    2.   准备代码

    要使用Java Service Wrapper,自己原有的程序必须进行一次改造或者添加一个包装类。这里使用一个最简单的HelloWorld类作为示例。

    package com.yjw;

     

    import javax.swing.JFrame;

    import javax.swing.JLabel;

     

    import org.tanukisoftware.wrapper.WrapperListener;

    import org.tanukisoftware.wrapper.WrapperManager;

     

    // 实现WrapperListener接口

    public class HelloWorld implements   WrapperListener{

        private static void createAndShowGUI() {

           JFrame.setDefaultLookAndFeelDecorated(true);

     

           JFrame frame = new JFrame("HelloWorldSwing");

           frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

     

           JLabel label = new JLabel("Hello World");

           frame.getContentPane().add(label);

     

           frame.setSize(150, 100);

           frame.setVisible(true);

        }

     

        public static void main(String[] args) {

           javax.swing.SwingUtilities.invokeLater(new Runnable() {

               public void run() {

                  createAndShowGUI();

               }

           });

    //这里,启动HelloWold

           WrapperManager.start(   new   HelloWorld(),   args   );  

        }

    //需要一个start方法

        public Integer start(String[] args) {

           System.out.println("start()");

     

           try {

               System.out.println("HelloWorld!");

           } catch (Exception e) {

           }

           return null;

        }

    //需要一个stop方法

        public int stop(int exitCode) {

           System.out.println("stop(" + exitCode + ")");

           return exitCode;

        }

    //需要一个controlEvent方法

        public void controlEvent(int event) {

           System.out.println("controlEvent(" + event + ")");

        }

     

    }

     

     

    这里,直接把入口类进行了代码改造,用户也可以单独写一个包装类,把上面带注释的四个地方的代码提取出来,对自己原来的入口类进行包装。

     

    注意:如果没有对入口类进行java wrapper service需要的代码改造,则在做成服务后,表现为JVM试图不停地启动服务,查看wrapper.log,会发现类似如下的报错:

      INFO       |   wrapper     |   2010/04/16   21:24:58   |   Waiting   to   start...   
      INFO       |   wrapper     |   2010/04/16   21:25:03   |   Waiting   to   start...   
      INFO       |   wrapper     |   2010/04/16   21:25:08   |   Waiting   to   start...   
      ERROR     |   wrapper     |   2010/04/16   21:25:29   |   Startup   failed:   Timed   out   waiting   for   a   signal   from   the   JVM.   
      ------------------------------------------------------------------------   
      ADVICE   |   wrapper     |   2010/04/16   21:25:29   |     
      ERROR     |   wrapper     |   2010/04/16   21:25:29   |   JVM   did   not   exit   on   request,   terminated   
      FATAL     |   wrapper     |   2010/04/16   21:25:29   |   There   were   5   failed   launches   in   a   row,   each   lasting   less   than   300   seconds.     Giving   up.   
      FATAL     |   wrapper     |   2010/04/16   21:25:29   |       There   may   be   a   configuration   problem:   please   check   the   logs.   
      STATUS   |   wrapper     |   2010/04/16   21:25:29   |   <--   Wrapper   Stopped

     

    将HelloWorld.java打成HelloWorld.jar。

     

    3.   实现服务

    1)           准备工作区

    准备一个工作文件夹,例如test,在test下新建conf,log,lib三个文件夹

     

    2)           将下载下来的java wrapper service解压缩

    a) 将Java Service Wrapper包中bin下的wrapper.exe拷贝至test下

    b) 将Java Service Wrapper包中src/bin下的App.bat.in(测试运行),InstallApp-NT.bat.in(安装windows服 务),UninstallApp-NT.bat.in(卸载windows服务)拷贝至test下,并且将后缀.in去掉

    c) 修改App.bat,InstallApp-NT.bat,UninstallApp-NT.bat中的set _WRAPPER_CONF="%_REALPATH%confwrapper.conf"

    d) 将conf文件夹下的wrapper.conf拷贝至test/conf下

    e) 将Java Service Wrapper包中lib下的Wrapper.DLL,wrapper.jar拷贝至test/lib下

     

    3)           准备可用jar包

    HelloWorld.jar此时还不能直接使用,需要进行改造

    a) 将HelloWorld.jar解压缩,提取META-INF/MANIFEST.MF文件

    b) 打开MANIFEST.MF,在Class-Path中追加wrapper.jar wrapper.dll

    c) 将HelloWorld.jar和改造过的MANIFEST.MF一起拷贝到%JAVA_HOME%/bin下

    d) 打开cmd窗口,将路径切换至%JAVA_HOME%/bin

    e) 输入命令jar umf MANIFEST.MF HelloWorld.jar,此时HelloWorld.jar中的MANIFEST.MF已被更新为当前的MANIFEST.MF

    f)   将更新后的HelloWorld.jar拷贝至test/lib下

     

    4)           配置wrapper.conf

    打开test/conf/wrapper.conf

     

    #程序的入口

    wrapper.java.mainclass=com.yjw.HelloWorld

     

    #程序jar,包括wrapper.jar

    wrapper.java.classpath.1=lib/HelloWorld.jar

    wrapper.java.classpath.2=lib/wrapper.jar

     

    #程序的文件夹,这里为lib

    wrapper.java.library.path.1=lib

     

    #注意:有的教程注释为程序的入口,虽然能够正常运行,但是这是概念性错误!

    #这个参数指传给主程序的参数入口,比如笔者有个程序,传值0表示为英文版,1为中文版,参数就在这里配置。如果有多个参数,请自行配置

    #为wrapper.app.parameter.n=XXX

    wrapper.app.parameter.1=1

     

    #日志文件生成的位置

    wrapper.logfile=log/wrapper.log

     

    #windows服务所需的标题,名称,显示名和描述
    wrapper.console.title=HelloWorld
    wrapper.ntservice.name= HelloWorld
    wrapper.ntservice.displayname= HelloWorld 
    wrapper.ntservice.description= HelloWorld

     

    5)           运行App.bat,如果没有错误出现,说明配置正常,就可以运行InstallApp-NT.bat将你的程序做成Windows服务了。所有信息都可以在log/wrapper.log日志文件里找到

     

    6)           如果要打开调试信息,在test/conf/wrapper.conf中将wrapper.debug=TRUE前面的#号去掉即可打开调试功能

    追问:

    装完的服务,可执行文件的路径是这个

    C:WRAPPER_HOMEinwrapper.exe -s C:WRAPPER_HOMEconfwrapper.conf

    比如我想改成c:123.jar

    要怎么改呢

    回答:

    #程序的入口

    wrapper.java.mainclass=执行的类名

     

    #程序jar,包括wrapper.jar

    wrapper.java.classpath.1=C:/123.jar

    追问:

    wrapper.java.classpath.1=C:/123.jar服务安装了。。。不能启动

    一直显示wrapper  | Waiting to start...

    最后就关闭了!

    回答:
    程序需要改写,实现WrapperListener接口
    追问:

    能简单给个例子么 比如开机显示hello world  对接口不这么熟悉  谢谢了

    回答:
    上面不是给了吗
    追问:
    .....上面给的不对。。。。。运行不了。。。。不能启动服务
    回答:

    上面只是例子,你的类要implements   WrapperListener,然后public Integer start(String[] args) {

    实现start,stop,controlEvent这三个方法。

    追问:

    没弄过这个。。。。能给个具体的代码不。。。整段的

    回答:

    import java.io.*;

    importorg.tanukisoftware.wrapper.WrapperListener;

    importorg.tanukisoftware.wrapper.WrapperManager;

     

    public class Server1 implementsWrapperListener

    {

           publicstatic void main(String[] args)

          {

                  System.out.println(   "Initializing... "   );

                  WrapperManager.start(newServer1(),args);

          }

          

           //实现start方法

       public Integer start(String[] args) {

          System.out.println("start()");

          try {

              System.out.println("Hello,World!");

          } catch (Exception e) {

          }

          return null;

        }

          

           //实现stop方法

       public int stop(int exitCode) {

          System.out.println("stop(" + exitCode + ")");

          return exitCode;

        }

          

           //实现controlEvent方法

       public void controlEvent(int event) {

          System.out.println("controlEvent(" + event + ")");

        }    

    }


    追问:

    Server1.java:2: 软件包 org.tanukisoftware.wrapper 不存在
    import org.tanukisoftware.wrapper.WrapperListener;

    。。。这玩意在哪。。。。

    回答:
    在wrapper.jar文件里呀,把它放到classpath里。或者用-cp指定,如:javac -cp wrapper Server.java
    追问:

    整体。。。。全套     完全 点。。。。行不

    回答:

    这些都是java基础的吧。

    编译成class后最后就剩打包成jar了,

    写一个manifest.mf文件,里面就两行:Main-Class: test.Test <回车> ,也就是第二行是空行。

    运行jar  cvfm Server1.jar manifest.mf Server1

    生成jar文件就好了

    追问:
    ........问的不是这个。。。。javac -cp wrapper Server.java 这个不懂
    回答:

    cp的就是classpath的缩写。

    importorg.tanukisoftware.wrapper.WrapperListener;

    importorg.tanukisoftware.wrapper.WrapperManager;

    这2个都是Java Service Wrap提供的类,编译的时候,必须在classpath里.

    或者把wrapper.jar放在环境变量里的话,或者用javac的时候用cp参数临时指定到哪里找wrapper.jar。比如

    javac -cp d:wrapper.jar Server.java

     

    转自:http://blog.csdn.net/kevinlifeng/article/details/9423969

  • 相关阅读:
    最短路小变形
    最短路
    bfs + 路径输出
    优先队列
    dijkstra
    重载运算符-operator
    最短路
    二分图匹配
    依赖型的关系建立
    string 类
  • 原文地址:https://www.cnblogs.com/qiyebao/p/3770040.html
Copyright © 2020-2023  润新知