我们已经了解Wrapper的目录结构,下面可是正式利用Wrapper来包装我们自己的应用,这里假设Wrapper的安装目录为:/usr/local/wrapper。
首先,创建项目应用
1.创建一个Java项目,并创建Java 类HelloWorld,并实现WrapperListener 接口,代码如下:
package com.helloworld.hello; import org.apache.log4j.Logger; public class HelloWorld { static Logger logger=Logger.getLogger(HelloWorld.class); public static void main(String[] args) { logger.info("Hello World!"); } }
代码很简单只是作为实例作用,这里引用了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千行,其实不必担心,我们只需要改文件头部的配置信息即可,内容如下:
# 应用名称 APP_NAME="hello" # 应用全名 APP_LONG_NAME="helloWorld" # Wrapper主程序所在目录及名称 WRAPPER_CMD="./wrapper" # 配置文件所在目录及名称 WRAPPER_CONF="../conf/wrapper.conf"
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"为起始,添加完成之后如下:
wrapper.java.classpath.1=../lib/hello.jar wrapper.java.classpath.2=../lib/wrapper.jar wrapper.java.classpath.3=../lib/log4j-1.2.17.jar wrapper.java.classpath.4=../lib/slf4j-api-1.7.5.jar wrapper.java.classpath.5=../lib/slf4j-log4j12-1.7.5.jar
甚至你可以直接修改为:
wrapper.java.classpath.1=../lib/*.jar
来加载lib目录下的所有jar包。
(4)找到"wrapper.java.library.path.1=../lib"这行(64行),这是lib所在目录可以根据情况修改。
至此所有配置文件的基本修改已经完成,输入以下命令来启动我们的程序:
root@TFS:/usr/local/wrapper/bin# ./hello console Running helloWorld... wrapper | --> Wrapper Started as Console wrapper | Java Service Wrapper Community Edition 64-bit 3.5.20 wrapper | Copyright (C) 1999-2013 Tanuki Software, Ltd. All Rights Reserved. wrapper | http://wrapper.tanukisoftware.com wrapper | wrapper | Launching a JVM... wrapper | JVM exited while loading the application. jvm 1 | <helloWorld>:<INFO>:2013-07-30 16:45:43 com.helloworld.hello.HelloWorld.main(HelloWorld.java:13): Hello World! wrapper | Launching a JVM... wrapper | JVM exited while loading the application. jvm 2 | <helloWorld>:<INFO>:2013-07-30 16:45:47 com.helloworld.hello.HelloWorld.main(HelloWorld.java:13): Hello World! wrapper | Launching a JVM... wrapper | JVM exited while loading the application. jvm 3 | <helloWorld>:<INFO>:2013-07-30 16:45:52 com.helloworld.hello.HelloWorld.main(HelloWorld.java:13): Hello World! wrapper | Launching a JVM... wrapper | JVM exited while loading the application. jvm 4 | <helloWorld>:<INFO>:2013-07-30 16:45:57 com.helloworld.hello.HelloWorld.main(HelloWorld.java:13): Hello World! wrapper | Launching a JVM... wrapper | JVM exited while loading the application. jvm 5 | <helloWorld>:<INFO>:2013-07-30 16:46:01 com.helloworld.hello.HelloWorld.main(HelloWorld.java:13): Hello World! wrapper | There were 5 failed launches in a row, each lasting less than 300 seconds. Giving up. wrapper | There may be a configuration problem: please check the logs. wrapper | <-- Wrapper Stopped
得到以上提示说明程序已经运行成功了,但是我们发现最终Wrapper 还是由于报错而退出了,并且提示我们可能是配置问题,而且我们看到居然启动了5个jvm 线程。
接下来修改上面的代码,让HelloWorld 类实现WrapperListener 接口,修改后的代码如下:
package com.helloworld.hello; import org.tanukisoftware.wrapper.WrapperListener; import org.tanukisoftware.wrapper.WrapperManager; public class HelloWorld implements WrapperListener { public static void main(String[] args) { // 打印参数 for (String arg : args) System.out.println(arg); WrapperManager.start(new HelloWorld(), args); } @Override public void controlEvent(int event) { System.out.println("controlEvent(" + event + ")"); if ((event == WrapperManager.WRAPPER_CTRL_LOGOFF_EVENT) && (WrapperManager.isLaunchedAsService() || WrapperManager.isIgnoreUserLogoffs())) { } else { WrapperManager.stop(0); } } @Override public Integer start(String[] args) { // 打印参数 for (String arg : args) System.out.println(arg); System.out.println("hello world!"); return null; } @Override public int stop(int exitCode) { System.out.println("stop(" + exitCode + ")"); return exitCode; } }
然后再运行服务,显示如下结果:
root@TFS:/usr/local/wrapper/bin# ./hello console Running helloWorld... wrapper | --> Wrapper Started as Console wrapper | Java Service Wrapper Community Edition 64-bit 3.5.20 wrapper | Copyright (C) 1999-2013 Tanuki Software, Ltd. All Rights Reserved. wrapper | http://wrapper.tanukisoftware.com wrapper | wrapper | Launching a JVM... jvm 1 | g21121 jvm 1 | http://286.iteye.com/ jvm 1 | WrapperManager: Initializing... jvm 1 | g21121 jvm 1 | http://286.iteye.com/ jvm 1 | hello world! jvm 1 | stop(0) wrapper |
相关推荐
- Spring Boot应用:你的应用应该是基于Spring Boot框架构建的,并且已经打包为可执行的JAR或WAR文件。 ### 3. 获取Wrapper工具 从官方仓库下载适合Windows系统的`wrapper`二进制包,这个压缩包中应该包含了`...
接下来,创建服务应用程序目录`C:\MyServApp`,并在其中构建`bin`、`conf`、`logs`、`lib`四个子目录。将你的应用程序如`NioBlockingServer.class`拷贝到`C:\MyServApp`目录下。 #### 二、配置与部署 1. **复制...
MyBatis-Plus的QueryWrapper是其强大的查询构造器,为开发者提供了便利的API来构建复杂的SQL查询。在Spring Boot项目中,MyBatis-Plus作为一个扩展MyBatis的轻量级框架,大大简化了数据库操作。下面我们将深入探讨...
Android-PWA-Wrapper 是一个开源项目,其主要目标是帮助开发者将支持离线功能的渐进式Web应用程序(PWA)转化为原生的Android应用程序。这个工具为开发者提供了一个便捷的方式,让他们能够利用已有的PWA,通过简单的...
通过深入理解其源码,我们可以更好地利用它来构建高效、可靠的数据库应用。无论是在移动设备还是桌面系统上,Kompex SQLite Wrapper 都能提供稳定且易用的数据库访问功能。通过学习和实践,开发者可以充分利用这个库...
【标题】:“maven-wrapper-windows服务” ...通过上述步骤,开发者可以轻松地在Windows服务器上部署和管理自己的Java应用。这是一个强大的实践技巧,对于Java开发者和运维人员来说都十分有价值。
RDP Wrapper提供了一个服务,可以使得未授权的RDP客户端也能与服务器建立连接,这对于某些需要远程管理的场景非常有用。 在压缩文件中,我们看到几个关键的文件夹: 1. **Main**:这个目录通常包含RDP Wrapper的...
总的来说,`Laravel开发-dbwrapper`是一个增强Laravel数据库操作的工具,通过提供额外的功能和灵活性,使得开发者能够更好地管理和利用数据库资源,提高应用程序的效率和可靠性。在使用过程中,理解并充分利用这些...
综上所述,Delphi Wrapper for V8 提供了一种高效、便捷的方式来在 Delphi 应用程序中使用 V8 引擎,极大地扩展了 Delphi 开发者的工具箱,使得在 Delphi 平台上构建富客户端应用变得更加容易。
采用VS2010编译libcef_dll_wrapper.lib,意味着开发者可以利用VS2010的特性来构建和调试与CEF相关的应用。 4. **Release与Debug版本**:压缩包中包含Release和Debug两种配置的libcef_dll_wrapper.lib。Release版本...
Wrapper是Mybatis Plus中用于构建动态SQL的关键类。它允许开发者通过链式API构建复杂的查询条件,避免手动拼接SQL字符串,从而减少错误和提高代码可读性。 2. 使用方法 使用Wrapper,我们可以创建各种条件对象,如...
在Matlab Wrapper for Graph Cuts中,用户可以利用这个工具包提供的函数对图像进行预处理,构建相应的图结构,然后应用Graph Cuts算法进行分割。该工具包可能包含了如下功能: 1. **图的构建**:根据图像的像素特征...
Java Service Wrapper是一个强大的工具,它允许开发者将Java应用程序在Windows操作系统上包装成系统服务,这样应用程序就可以在系统启动时自动启动,并且可以在后台无用户界面的情况下运行。这个工具对于那些需要...
st_asio_wrapper是一个C/S(客户端/服务器)网络编程框架,该框架通过封装Boost.Asio来简化网络编程的过程,使开发者能够更快速地构建C/S系统。Boost.Asio本身是一个通用的C++网络编程库,提供了广泛的I/O功能集合,...
专家们可能会发现这里的描述略显简化,但足以理解TCP Wrapper的工作原理和应用背景。 在UNIX系统中,网络服务通常由守护进程(daemon)来提供,这些守护进程监听特定的端口,等待接收来自网络的连接请求。例如,`...
ZooKeeper是一个广泛使用的分布式协调服务,常用于管理分布式应用中的配置信息、命名服务、集群状态等。"云原生"(Cloud Native)则意味着这个库设计时考虑了现代云环境的特点,如容器化、微服务架构、持续集成/持续...
- **SLAM(同时定位与建图)**:D435i的深度和IMU数据可用于构建室内环境的地图,并实现自主导航。 - **物体检测与识别**:结合深度信息,可以进行精准的3D物体检测和识别。 - **避障与运动规划**:利用深度信息...
4. 使用Swift或Xcode进行iOS应用的构建和调试。 通过iOS-PWA-Wrapper,开发者可以快速地将已有的PWA转换为能够在App Store上分发的iOS应用,从而拓宽其触达范围,同时保留PWA的跨平台优势和离线访问能力。
在现代网页设计和移动应用开发中,图像资源的大小往往直接影响到页面加载速度和整体性能。TinyPNG利用智能有损压缩技术,能够在保持图片视觉质量的同时显著降低文件大小,尤其适合对图像质量和加载速度有高要求的...
SLAM模块能够构建环境的3D地图,并实时估计相机的轨迹,对于移动机器人和自动驾驶等应用尤为关键。场景理解则包括对象检测、追踪等功能,可以帮助机器人识别和交互环境中的物体。 总的来说,zed-ros-wrapper为ROS...