Java Service Wrapper-构建自己的Wrapper应用

时间:2022-11-04 21:01:46

        我们已经了解Wrapper的目录结构,下面可是正式利用Wrapper来包装我们自己的应用,这里假设Wrapper的安装目录为:/usr/local/wrapper。

 

        首先,创建项目应用

 

        1.创建一个Java项目,并创建Java 类HelloWorld,并实现WrapperListener 接口,代码如下:

Java代码  Java Service Wrapper-构建自己的Wrapper应用
  1. package com.helloworld.hello;  
  2.   
  3. import org.apache.log4j.Logger;  
  4.   
  5. public class HelloWorld {  
  6.       
  7.     static Logger logger=Logger.getLogger(HelloWorld.class);  
  8.   
  9.     public static void main(String[] args) {  
  10.         logger.info(”Hello World!”);  
  11.     }  
  12.   
  13. }  
Java Service Wrapper-构建自己的Wrapper应用

 

 

        代码很简单只是作为实例作用,这里引用了log4j 是为了展示在项目有依赖类库的情况下如何使用Wrapper 进行包装。

 

        2.导入相应log4j 的jar 包到classpath 或工程build path 下。


        3.将工程导出为Jar 包形式:
        (1)在工程名上右键 –>Export –>JAR file 导出为hello.jar。
        注:选择可运行Jar 导出时会将程序所依赖的相关类包含在Jar 中一并导出,这样做的好出就是不再需要添加额外的依赖类库,直接将此Jar包发布即可,缺点也很明显依赖关系严重不利于升级维护。
        (2)更多的情况是直接按普通jar 包导出,然后在classpath 中添加相关依赖类库,这样更加便于维护,我们将按此种方式举例,导出名为hello.jar。

 

        其次,上传Wrapper相关文件

 

        1.上传程序及依赖:
        (1)上传hello.jar 与依赖类库至服务器wrapper 所在lib 目录.
        (2)上传Wrapper lib 目录下的wrapper.jar和libwrapper.so 至服务器/usr/local/wrapper/lib 目录。

        2.上传wrapper 主程序:
        (1)上传Wrapper bin 目录下的wrapper 文件至服务器/usr/local/wrapper/bin目录。
        (2)上传Wrapper src/bin 目录下的sh.script.in 文件至服务器/usr/local/wrapper/bin 目录,并修改文件名称为:hello,去掉”.script.in”后缀。

 

        3.上传Wrapper conf 目录下的wrapper.conf 文件至服务器/usr/local/wrapper/conf目录。

 

        最后,修改相关配置文件内容


        1.修改bin 目录下的hello 文件内容,利用vi 打开发现内容有将近2千行,其实不必担心,我们只需要改文件头部的配置信息即可,内容如下:

Conf代码  Java Service Wrapper-构建自己的Wrapper应用
  1. # 应用名称  
  2. APP_NAME=”hello”  
  3. # 应用全名  
  4. APP_LONG_NAME=”helloWorld”  
  5.   
  6. # Wrapper主程序所在目录及名称  
  7. WRAPPER_CMD=”./wrapper”  
  8. # 配置文件所在目录及名称  
  9. WRAPPER_CONF=”../conf/wrapper.conf”  
Java Service Wrapper-构建自己的Wrapper应用

 

 

        2.修改conf 目录下的wrapper.conf 文件内容。
        (1)找到”wrapper.java.command=java” 这行(43行),可以根据服务器配置修改为”wrapper.java.command=%JAVA_HOME%/bin/java”
        (2)找到”wrapper.java.mainclass=org.tanukisoftware.wrapper.test.Main” 这行(56行),这是程序的入口即main函数所在类,修改成”com.helloworld.hello.HelloWorld”
        (3)找到”wrapper.java.classpath.1=../lib/wrappertest.jar”这行(60,61行),这行表示依赖jar包的位置,作用类似于build path或classpath,我们可以按照顺序依次添加我们所依赖的jar包,需要注意的是序号必须以”1”为起始,添加完成之后如下:

Conf代码  Java Service Wrapper-构建自己的Wrapper应用
  1. wrapper.java.classpath.1=../lib/hello.jar  
  2. wrapper.java.classpath.2=../lib/wrapper.jar  
  3. wrapper.java.classpath.3=../lib/log4j-1.2.17.jar  
  4. wrapper.java.classpath.4=../lib/slf4j-api-1.7.5.jar  
  5. wrapper.java.classpath.5=../lib/slf4j-log4j12-1.7.5.jar  
Java Service Wrapper-构建自己的Wrapper应用

 

        甚至你可以直接修改为:

Conf代码  Java Service Wrapper-构建自己的Wrapper应用
  1. wrapper.java.classpath.1=../lib/*.jar  
Java Service Wrapper-构建自己的Wrapper应用

 

        来加载lib目录下的所有jar包。

 

        (4)找到”wrapper.java.library.path.1=../lib”这行(64行),这是lib所在目录可以根据情况修改。

 

        至此所有配置文件的基本修改已经完成,输入以下命令来启动我们的程序:

Shell代码  Java Service Wrapper-构建自己的Wrapper应用
  1. root@TFS:/usr/local/wrapper/bin# ./hello console  
  2. Running helloWorld…  
  3. wrapper  | –> Wrapper Started as Console  
  4. wrapper  | Java Service Wrapper Community Edition 64-bit 3.5.20  
  5. wrapper  |   Copyright (C) 1999-2013 Tanuki Software, Ltd. All Rights Reserved.  
  6. wrapper  |     http://wrapper.tanukisoftware.com  
  7. wrapper  |   
  8. wrapper  | Launching a JVM…  
  9. wrapper  | JVM exited while loading the application.  
  10. jvm 1    | <helloWorld>:<INFO>:2013-07-30 16:45:43 com.helloworld.hello.HelloWorld.main(HelloWorld.java:13): Hello World!  
  11. wrapper  | Launching a JVM…  
  12. wrapper  | JVM exited while loading the application.  
  13. jvm 2    | <helloWorld>:<INFO>:2013-07-30 16:45:47 com.helloworld.hello.HelloWorld.main(HelloWorld.java:13): Hello World!  
  14. wrapper  | Launching a JVM…  
  15. wrapper  | JVM exited while loading the application.  
  16. jvm 3    | <helloWorld>:<INFO>:2013-07-30 16:45:52 com.helloworld.hello.HelloWorld.main(HelloWorld.java:13): Hello World!  
  17. wrapper  | Launching a JVM…  
  18. wrapper  | JVM exited while loading the application.  
  19. jvm 4    | <helloWorld>:<INFO>:2013-07-30 16:45:57 com.helloworld.hello.HelloWorld.main(HelloWorld.java:13): Hello World!  
  20. wrapper  | Launching a JVM…  
  21. wrapper  | JVM exited while loading the application.  
  22. jvm 5    | <helloWorld>:<INFO>:2013-07-30 16:46:01 com.helloworld.hello.HelloWorld.main(HelloWorld.java:13): Hello World!  
  23. wrapper  | There were 5 failed launches in a row, each lasting less than 300 seconds.  Giving up.  
  24. wrapper  |   There may be a configuration problem: please check the logs.  
  25. wrapper  | <– Wrapper Stopped  
Java Service Wrapper-构建自己的Wrapper应用

 

        得到以上提示说明程序已经运行成功了,但是我们发现最终Wrapper 还是由于报错而退出了,并且提示我们可能是配置问题,而且我们看到居然启动了5个jvm 线程。

 

        接下来修改上面的代码,让HelloWorld 类实现WrapperListener 接口,修改后的代码如下:

Java代码  Java Service Wrapper-构建自己的Wrapper应用
  1. package com.helloworld.hello;  
  2.   
  3. import org.tanukisoftware.wrapper.WrapperListener;  
  4. import org.tanukisoftware.wrapper.WrapperManager;  
  5.   
  6. public class HelloWorld implements WrapperListener {  
  7.   
  8.     public static void main(String[] args) {  
  9.         // 打印参数  
  10.         for (String arg : args)  
  11.             System.out.println(arg);  
  12.         WrapperManager.start(new HelloWorld(), args);  
  13.     }  
  14.   
  15.     @Override  
  16.     public void controlEvent(int event) {  
  17.         System.out.println(”controlEvent(“ + event + “)”);  
  18.         if ((event == WrapperManager.WRAPPER_CTRL_LOGOFF_EVENT) && (WrapperManager.isLaunchedAsService() || WrapperManager.isIgnoreUserLogoffs())) {  
  19.         } else {  
  20.             WrapperManager.stop(0);  
  21.         }  
  22.     }  
  23.   
  24.     @Override  
  25.     public Integer start(String[] args) {  
  26.         // 打印参数  
  27.         for (String arg : args)  
  28.             System.out.println(arg);  
  29.         System.out.println(”hello world!”);  
  30.         return null;  
  31.     }  
  32.   
  33.     @Override  
  34.     public int stop(int exitCode) {  
  35.         System.out.println(”stop(“ + exitCode + “)”);  
  36.         return exitCode;  
  37.     }  
  38.   
  39. }  
Java Service Wrapper-构建自己的Wrapper应用

 

 

        然后再运行服务,显示如下结果:

Shell代码  Java Service Wrapper-构建自己的Wrapper应用
  1. root@TFS:/usr/local/wrapper/bin# ./hello console  
  2. Running helloWorld…  
  3. wrapper  | –> Wrapper Started as Console  
  4. wrapper  | Java Service Wrapper Community Edition 64-bit 3.5.20  
  5. wrapper  |   Copyright (C) 1999-2013 Tanuki Software, Ltd. All Rights Reserved.  
  6. wrapper  |     http://wrapper.tanukisoftware.com  
  7. wrapper  |   
  8. wrapper  | Launching a JVM…  
  9. jvm 1    | g21121  
  10. jvm 1    | http://286.iteye.com/  
  11. jvm 1    | WrapperManager: Initializing…  
  12. jvm 1    | g21121  
  13. jvm 1    | http://286.iteye.com/  
  14. jvm 1    | hello world!  
  15. jvm 1    | stop(0)  
  16. wrapper  |  
Java Service Wrapper-构建自己的Wrapper应用

 

        这样的结果应该是我们想要的,但是两者有什么不同呢?WrapperManager的作用又是什么,为什么会用到它?下篇文章我们仔细分析一下Wrapper的高级应用及配置。


原文:http://286.iteye.com/blog/1916125