我有一些批量java命令行应用程序,计划部署为:
batch_apps
app_1
batch1.jar
run_batch1.sh
app_2
batch2.jar
run_batch3.sh
{...etc...}
组织共享库池的最佳做法是什么 - 例如log4j:
batch_apps
app_1
batch1.jar
run_batch1.sh
app_2
batch2.jar
run_batch3.sh
libs
log4j.jar
ojdbc.jar
并在每个应用程序自己的jar文件中包含单独的log4j.xml? 我知道我需要在清单或run_batchX.sh中将“库”添加到类路径中 (哪种方式更可取?)
我主要想知道什么是最有效的设置性能。
感谢
答案 0 :(得分:2)
在安装目录的根目录下拥有一个共享的libs目录绝对是可行的方法。由于libs将在内存中加载一次,当JVM启动时,无论您选择何种解决方案,都不会对性能产生影响。
我不会将类路径放在jar文件中,因为如果你需要重新定位你的lib目录,这会迫使你改变你的jar。编辑脚本要简单得多。
出于同样的原因,我也不会在你的jar文件中包含log4j conf文件。
答案 1 :(得分:1)
您的应用程序似乎不共享单个JVM实例。 (即它们是通过'java -jar batch1.jar'或类似的单独启动的。)因此,共享库.jar文件只能节省DISK空间而不是RAM。
如果应用程序不共享单个JVM ,则易于部署应优先于磁盘空间。 (你的时间比一些“浪费”MB更值钱。)
在这个例子中,我建议将每个应用程序自包含在单个.jar文件中,包括其所有库,或单个.jar文件夹。 (即将每个应用程序的库放在该应用程序的文件夹中。)
如果应用程序共享一个JVM ,那么我建议使用共享库文件夹选项。
答案 2 :(得分:0)
这并没有直接回答你的问题,但我已经尝试了你提出的方法,但现在每个应用程序创建一个jar(看看如何做with Ant)。这样,不需要在类路径中包含任何内容:
java -jar myApp.jar
就是你所需要的。我发现它更清洁,但一切都有争议。
由于每个应用程序都在自己的JVM中运行,因此它与性能观点没有任何区别。
唯一的缺点是每个jar文件中都会有一些库。存储在高清上的成本更高,但是现在,MB相当便宜:-)我交易简单(没有外部lib文件夹)并且没有jar地狱(不将你的jar放在Java ext文件夹中)随时随地存储价格。如果您的应用程序不包含TB的库,我认为没问题。
对于Log4j配置文件,我会在jar中放置一个默认文件,但提供一个示例配置文件(log4j-custom.xml.sample)
,有人可以在命令行中修改和指定:
java -Dlog4j.configuration=log4j-custom.xml -jar myApp.jar
答案 3 :(得分:0)
您可以使用java扩展机制。将它们放在JAVA_HOME / lib / ext中,所有应用程序都可以访问它们。当然,这可能不是所有部署的最佳选择,但它当然更容易。