什么是适用于Java控制台应用程序的良好部署目录结构

6
我有一个 Java 控制台应用程序,现在准备部署到 Unix 服务器。我正在编写一个 shell 脚本来运行该应用程序。
我的计划是将 shell 脚本放入一个文件夹中,将应用程序 jar 和依赖的 jar(spring 等)放入另一个文件夹中,并将需要维护的属性文件(比如说实时更改的)放在一个单独的文件夹中。然后,我的 shell 脚本将遍历“jars”和“properties”文件夹中的文件,并将它们追加到类路径中,最后调用 java 命令……
这样的部署结构合适吗?有没有关于如何安排文件以最大程度地提高可维护性和稳定性的指南?有没有明显的“错误”方式应该避免?
附注一下,对于上一个项目,我将所有 shell 脚本(启动 java 进程和不启动 java 进程的脚本)都放在 scripts 文件夹中,将应用程序 jar 放在一个包含库 jar 的 library 子文件夹的文件夹中,并将外部资源放在 config 子文件夹中。然后,我编写了一个脚本来显式加载所有文件。虽然这样做很费劲并且需要在我升级库 jar 时进行维护,但这次我想做得更好。而且,将应用程序 JAR 与库分开似乎是不必要的。

1
Maven可以为您的jar创建一个清单文件,并引用您的库jar,然后Java本身会找到这些文件。此外,根据您如何“查找”属性文件,您可以通过单个类路径条目轻松完成。编写shell脚本的工作将大大减少。 - Konstantin
谢谢。我会调查使用maven-jar-pluging来减轻我的工作量。我忘记了清单文件可以做到这一点。 - Sarah Phillips
4个回答

2

就我个人而言,这是我们使用的内容;


/
    /class
        //package hierarchy here, raw .class files
    /lib
        //library jars here, apache commons, gson etc, all .jars
    /conf
        //.properties files go here, including ones for libraries
    /doc
        //program documentation files, typically .txt
        /javadocs
            //java doc html root
    /sh
        //shell scripts including execute.sh and compile.sh

我们使用ant进行构建,如果需要,通常会有一个src文件夹用于源代码树。这样,您只需添加/class/lib到类路径中,而这个路径永远不会改变。

这就是我想的。我猜看到它在其他地方被使用还是不错的。 - Sarah Phillips

1

对于你的情况来说,一个很好的结构是所谓的uberJar或oneJar,可以使用许多工具来制作,只需搜索一下即可。此外,我还可以推荐这样一段不错的代码 http://www.jdotsoft.com/JarClassLoader.php


我可以看出这会让类路径和部署更容易。我的担忧在于它隐藏了部署中使用的实际库。虽然理论上可以确定哪些 JAR 包的哪些版本被打包到了超级 JAR 中,但我能想象普通维护人员可能会有所担心。 - Sarah Phillips
检查JarClassloader,它允许嵌套的jar包。 - xeye

1
坦白地说,如果只是一个小应用程序,我会将其全部放在/opt/<my_java_app>下,并在那里建立与dev相同的目录子结构。
如果您想更符合UNIX推荐的做法,那么请将可执行文件(包括您的jar)放在/usr/local/bin/<my_java_app>中,配置文件放在/etc/<my_java_app>中,日志文件和其他数据文件放在/var/<my_java_app>中。
此外,您可能还想参考this document

0

构建一个系统本地的软件包,并使用系统默认设置。如果使用Debian,则可以直接从构建系统创建.deb文件(例如,使用ant deb task)。如果使用rpm,则使用rpm task。这样,您就可以像部署其他应用程序一样轻松地部署、卸载和更新应用程序。

系统软件包应该将库(我使用/usr/share/java/AppName来存放我的jar文件)和配置(到/etc/AppName/home/UserName/.AppName)分开;启动脚本我会将其符号链接到/usr/bin。除此之外,没有什么复杂的事情需要解决。我建议在您的发行版中查找知名的基于Java的软件包,并复制它们的启动脚本(特别是它们的VM定位魔法)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接