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

java控制台应用程序的良好部署目录结构是什么,java,unix,Java,Unix,我有一个Java控制台应用程序,可以部署到Unix服务器上。我正在编写一个shell脚本来运行应用程序 我计划将我的shell脚本放在一个文件夹中,将我的应用程序jar和依赖jar(spring等)放在另一个文件夹中,并将属性文件(需要“实时”维护的文件)放在另一个文件夹中。然后,我会让我的shell脚本遍历“jars”和“properties”文件夹中的文件,将它们附加到类路径,最后调用java 这是一个“好”的部署结构吗?对于如何安排文件以最大限度地提高可维护性和稳定性,是否有任何指导方针?

我有一个Java控制台应用程序,可以部署到Unix服务器上。我正在编写一个shell脚本来运行应用程序

我计划将我的shell脚本放在一个文件夹中,将我的应用程序jar和依赖jar(spring等)放在另一个文件夹中,并将属性文件(需要“实时”维护的文件)放在另一个文件夹中。然后,我会让我的shell脚本遍历“jars”和“properties”文件夹中的文件,将它们附加到类路径,最后调用java

这是一个“好”的部署结构吗?对于如何安排文件以最大限度地提高可维护性和稳定性,是否有任何指导方针?是否有明显的“错误”方法可以避免


我应该补充一点,对于上一个项目,我将所有shell脚本(启动java进程的脚本和不启动java进程的脚本)放入脚本文件夹,将我的应用程序jar放入一个文件夹,其中库jar位于库子文件夹中,外部资源位于配置子文件夹中。然后我编写了一个脚本,显式加载所有文件。写起来很冗长,每次升级库jar时都需要维护。这次我想做得更好。而且,我觉得没有必要将我的应用程序JAR与库分开。

适合您的案例的好结构是所谓的uberJar或oneJar,它可以通过大量的UTIL创建,只需谷歌一下即可。我还可以推荐一段很好的代码,如

,这就是我们使用的代码

/
    /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
添加到您的类路径中,这一点永远不会改变。

坦白地说,如果它只是一个小应用程序,我会将它全部放在
/opt/
下,并在那里有一个目录子结构,就像您在dev中做的那样

如果您想更符合UNIX推荐做法,请将可执行文件(包括
jar
)放在
/usr/local/bin/
中,将配置文件放在
/etc/
中,将日志文件和其他数据文件放在
/var/


此外,您可能需要参考。

构建系统本机软件包,并使用系统默认值。如果使用Debian,请直接从构建系统创建.deb(例如,使用)。如果使用RPM,请使用。这样,您就可以像其他应用程序一样轻松地部署、取消部署和更新应用程序


系统包应该将库(我使用
/usr/share/java/AppName
作为我的JAR)和配置(到
/etc/AppName
/home/UserName/.AppName
)分开;启动脚本I符号链接到
/usr/bin
。除此之外,让事情顺利进行也没有太大的复杂性。我建议在您的发行版中找到著名的基于java的软件包,并复制它们的启动脚本(特别是它们的VM定位魔术)。

Maven可以为您的jar创建一个清单文件,其中包含对库jar的引用,然后java本身就会找到这些文件。还取决于“查找”属性文件的方式,您可以只使用一个类路径条目来查找这些属性文件。编写shell脚本的工作将大大减少。谢谢。我将研究使用maven jar插件来减轻我的工作负载。我忘了清单文件可以做到这一点。这就是我的想法。我想看到它被其他地方使用是件好事。我可以看到这将如何使类路径和部署更容易。我担心的是,它隐藏了部署中使用的实际库。虽然理论上可以确定uberjar中打包了哪些JAR的版本,但我可以看到一般的维护人员都有理由担心。检查JarClassloader,它允许嵌套JAR。