在 Linux 上创建 Java 守护进程服务的工具
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1311268/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Tool for creating a Java daemon service on Linux
提问by Lehane
What is the best way to create a java application that can be run using ‘service' on Linux? I was going to use the JSW available here, but cannot use the licence on that (licence is either GPL or it costs money as far as I can tell). I'd need an apache style licence.
创建可以在 Linux 上使用“服务”运行的 Java 应用程序的最佳方法是什么?我打算使用此处提供的 JSW ,但不能使用该许可证(许可证是 GPL 或据我所知它需要花钱)。我需要一个 apache 风格的许可证。
I'm using maven to build, so it would be great if it was possible to create the service using a maven plugin, but any other suggestions would be great.
我正在使用 maven 构建,所以如果可以使用 maven 插件创建服务会很棒,但任何其他建议都会很棒。
I've seen Apache Commons Daemon, is there a maven plugin for this? Documentation seems sparse, so a working example of this would be good...
我见过Apache Commons Daemon,是否有一个 maven 插件?文档似乎很少,所以这个的工作示例会很好......
Thanks
谢谢
回答by robertc
Services on Linux are just shell scripts which start background processes. Have a look in /etc/init.d- you can open the files in a text editor. All you need is a bash script which responds to the parameters startand stopin an appropriate way (eg. startwill start your service and record the process ID in a known location, stopwill kill the process with the PID from the file you created), and then place it in /etc/init.d.
Linux 上的服务只是启动后台进程的 shell 脚本。看看/etc/init.d- 您可以在文本编辑器中打开文件。所有你需要的是一个bash脚本,响应参数start并stop以适当的方式(例如,start将启动您的服务,并在已知位置记录进程ID,stop将杀死的PID从创建该文件的进程),然后把它放在/etc/init.d.
Have a look at Init Scriptsand An introduction to services, runlevels, and rc.d scripts
回答by Rich Seller
As far as I know there isn't a Maven plugin for either Apache Daemon or Akuma. Though you could attempt to invoke them from within a Maven build by using the maven-exec-plugin.
据我所知,Apache Daemon 或Akuma都没有 Maven 插件。尽管您可以尝试使用maven-exec-plugin从 Maven 构建中调用它们。
As far as your companies reservations about using GPL-licensed products, it's worth reading up on the implications of use. It is not as virulent as corporations fear. Here's an interpretation of the GPL. It of course doesn't carry any weight in law (and may not be correct or supported by precedent, I am not a lawyer), but might be sufficient to allow you to start a conversation with your legal people.
至于贵公司对使用 GPL 许可产品的保留意见,值得一读使用的含义。它并不像企业所担心的那样具有毒性。这是GPL的解释。它当然在法律上没有任何意义(并且可能不正确或没有先例支持,我不是律师),但可能足以让您开始与您的法律人对话。
From the referenced page:
从参考页面:
Simply combining a copyrighted work with another work does not create a derivative work. The original copyrighted work must be modified in some way. The resulting derivative work must itself "represent an original work of authorship." So if the licensee does not modify the original GPL-licensed program, but merely runs it, he is not creating a derivative work.
简单地将受版权保护的作品与另一件作品结合并不会产生衍生作品。必须以某种方式修改原始受版权保护的作品。由此产生的衍生作品本身必须“代表原创作品”。因此,如果被许可人不修改原始的 GPL 许可程序,而只是运行它,那么他并不是在创作衍生作品。
There is the Appassembler Maven pluginthat I think does what you need (though it does create JSW wrappers). It creates a shell script (and a bat file), and collects all the application jars into a directory. It can optionally be configuredto create JSW-based Daemon configurations.
我认为有Appassembler Maven 插件可以满足您的需求(尽管它确实创建了 JSW 包装器)。它创建一个 shell 脚本(和一个 bat 文件),并将所有应用程序 jar 收集到一个目录中。可以选择将其配置为创建基于 JSW 的守护程序配置。
Here is an example configuration that will generate the standalone application in the target/appassembler folder, and generate the JSW wrapper files in the target/appassembler/jsw/myApp directory. Note the assemble goal is bound to the integration-test phase to ensure the project's jar is created. To generate the output run mvn verifyor to just generate the service wrappers run mvn package:
这是一个示例配置,它将在 target/appassembler 文件夹中生成独立应用程序,并在 target/appassembler/jsw/myApp 目录中生成 JSW 包装器文件。注意 assemble 目标绑定到集成测试阶段以确保创建项目的 jar。要生成输出,请运行mvn verify或仅生成服务包装器运行mvn package:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>appassembler-maven-plugin</artifactId>
<version>1.0</version>
<executions>
<execution>
<id>assemble-standalone</id>
<phase>integration-test</phase>
<goals>
<goal>assemble</goal>
</goals>
<configuration>
<programs>
<program>
<mainClass>name.seller.rich.MyMainClass</mainClass>
<name>myShellScript</name>
</program>
</programs>
<platforms>
<platform>windows</platform>
<platform>unix</platform>
</platforms>
<!--collect all jars into the lib directory-->
<repositoryLayout>flat</repositoryLayout>
<repositoryName>lib</repositoryName>
</configuration>
</execution>
<execution>
<id>generate-jsw-scripts</id>
<phase>package</phase>
<goals>
<goal>generate-daemons</goal>
</goals>
<configuration>
<!--declare the JSW config -->
<daemons>
<daemon>
<id>myApp</id>
<mainClass>name.seller.rich.MyMainClass</mainClass>
<commandLineArguments>
<commandLineArgument>start</commandLineArgument>
</commandLineArguments>
<platforms>
<platform>jsw</platform>
</platforms>
</daemon>
</daemons>
<target>${project.build.directory}/appassembler</target>
</configuration>
</execution>
</executions>
</plugin>
For reference the generated files are as follows:
生成的文件如下,供参考:
myApp\bin\myApp
myApp\bin\myApp.bat
myApp\bin\wrapper-linux-x86-32
myApp\bin\wrapper-macosx-universal-32
myApp\bin\wrapper-solaris-x86-32
myApp\bin\wrapper-windows-x86-32.exe
myApp\conf\wrapper.conf
myApp\lib\libwrapper-linux-x86-32.so
myApp\lib\libwrapper-macosx-universal-32.jnilib
myApp\lib\libwrapper-solaris-x86-32.so
myApp\lib\wrapper-windows-x86-32.dll
myApp\lib\wrapper.jar

