代码之家  ›  专栏  ›  技术社区  ›  webwesen

如何最有效地共享log4j库

  •  1
  • webwesen  · 技术社区  · 17 年前

    我有一些批处理的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中向类路径添加“libs”。 (哪条路比较好?)

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

    谢谢

    4 回复  |  直到 16 年前
        1
  •  2
  •   Varkhan    17 年前

    在install dir的根目录上有一个共享libs目录绝对是一种方法。由于libs将加载到内存中一次,所以当JVM启动时,无论您选择什么解决方案,都不会对性能产生影响。

    我不会将类路径放在JAR文件中,因为这将迫使您在需要重新定位lib目录时更改JAR。编辑脚本要简单得多。

    出于同样的原因,我也不会在JAR文件中包含log4j conf文件。

        2
  •  1
  •   Chris Nava    17 年前

    您的应用程序似乎不共享单个JVM实例。(也就是说,它们是通过Java-jar BATCH1.jar)单独启动的,或者是这样的。因此,共享库.jar文件只会节省磁盘空间而不是RAM。

    如果应用程序不共享单个JVM 那么,部署的易用性应该优先于磁盘空间。(您的时间价值超过了一些“浪费”的MB。)

    在本例中,我建议在单个.jar文件(包括其所有库)或单个.jar文件文件夹中使每个应用程序独立。(即,将每个应用的libs放在该应用的文件夹中。)

    如果应用程序共享一个JVM 然后我建议使用共享库文件夹选项。

        3
  •  0
  •   John Ellinwood    17 年前

    可以使用Java扩展机制。将它们放在java_Home/lib/ext中,所有应用程序都可以访问它们。当然,这对所有部署来说可能不是最好的,但肯定更容易。

        4
  •  0
  •   Community Mohan Dere    9 年前

    这并不能直接回答您的问题,但我已经尝试过您建议的方法,但现在将为每个应用程序创建一个JAR(请参阅如何执行该操作)。 with Ant )这样,就不需要在类路径中包含任何内容:

    java -jar myApp.jar
    

    是你所需要的。我觉得它更干净,但一切都有争议。

    从性能的角度来看,它没有任何区别,因为每个应用程序都在自己的JVM中运行。

    唯一的缺点是每个JAR文件中都存在一些库。存储在HD上的成本更高,但是现在MB非常便宜:-我在任何时候交易简单(没有外部LIB文件夹)和无jar地狱(不把JAR放在Java EXT文件夹中)超过存储价格。如果您的应用程序不包含库的terabyte,我认为这是可以的。

    对于log4j配置文件,我将在jar中放置一个默认文件,但提供一个示例配置文件( log4j-custom.xml.sample) 有人可以在命令行中修改和指定:

    java -Dlog4j.configuration=log4j-custom.xml -jar myApp.jar
    
    推荐文章