如何最有效地共享log4j库

时间:2009-04-03 19:24:19

标签: java batch-file jar

我有一些批量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中将“库”添加到类路径中 (哪种方式更可取?)

我主要想知道什么是最有效的设置性能。

感谢

4 个答案:

答案 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中,所有应用程序都可以访问它们。当然,这可能不是所有部署的最佳选择,但它当然更容易。