如何在嵌入式JDK compact 1/2/3中使用log4j

时间:2014-05-28 09:28:20

标签: java log4j embedded java-8

我尝试将现有的Java项目移植到嵌入式环境中。但是我发现log4j-1.2.14在这样的环境下无法工作。因为它与Beans有依赖关系。

我构建了EJDK8 compact 2环境。有关EJDK8的更多信息:http://www.oracle.com/technetwork/java/embedded/resources/tech/compact-profiles-overview-2157132.html

启动项目时,它有以下例外情况。

线程“main”中的异常java.lang.NoClassDefFoundError:java / beans / IntrospectionException      [java] at org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:649)      [java] org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:612)      [java] at org.apache.log4j.PropertyConfigurator.configureRootCategory(PropertyConfigurator.java:509)      [java] at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:415)      [java] at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:441)      [java] at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:470)      [java] at org.apache.log4j.LogManager。(LogManager.java:122)      [java] at org.slf4j.impl.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:66)      [java] at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:270)      [java] at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:281)      [java] at com.truviso.system.Application。(Application.java:36)      [java]引起:java.lang.ClassNotFoundException:java.beans.IntrospectionException      [java] at java.net.URLClassLoader $ 1.run(Unknown Source)      [java] at java.net.URLClassLoader $ 1.run(Unknown Source)      [java] java.security.AccessController.doPrivileged(Native Method)      [java] at java.net.URLClassLoader.findClass(Unknown Source)      [java] java.lang.ClassLoader.loadClass(未知来源)      [java] at sun.misc.Launcher $ AppClassLoader.loadClass(Unknown Source)      [java] java.lang.ClassLoader.loadClass(未知来源)      [java] ... 11更多

在阅读log4j源代码后,我发现java.beans有许多依赖关系。*。 EJDK不支持beans命名空间。在这种情况下,我们可以使用哪种日志框架? log4j广泛用于许多库中。我们还有其他选择吗?

3 个答案:

答案 0 :(得分:3)

  

在这种情况下,我们可以使用哪种日志框架? log4j广泛用于许多库中。我们还有其他选择吗?

嗯,java.util.logging位于compact1配置文件中,因此这是一个明显的候选者。

但是如果您使用的是直接依赖于log4j的库,那么您就会陷入困境。你要么需要" butcher" log4j(坏主意),或者您需要更改库的日志框架。如果您执行后者,请考虑将其更改为slf4j ...这将允许您使用各种"后端"日志框架,取决于您的应用程序或平台要求。

答案 1 :(得分:2)

基于某个配置文件的jrecreate构建工具,用于提供在应用程序中使用的jre。您可以选择最小的尺寸为compact1,compact2和compact3,并测试您的应用。 但有时一些应用程序需要访问更多资源,上面的选项是:

- vm服务器或所有大小都要高得多。

我的案例使用--vm服务器解决,依赖使用java / beans / IntrospectionException。

解决方案替代方案:

$ cd ejdk1.8.0_51
$ export JAVA_HOME=linux_i586/jre
$ ./bin/jrecreate.sh --vm server --dest version-server-jre8

Building JRE using Options {
ejdk-home: /home/bueno/Downloads/ejdk1.8.0_51
    dest: /home/bueno/Downloads/ejdk1.8.0_51/version-server-jre8
    target: linux_i586
    vm: server
    runtime: jre
    debug: false
    keep-debug-info: false
    no-compression: false
    dry-run: false
    verbose: false
    extension: []
}

Target JRE Size is 49.379 KB (on disk usage may be greater).
Embedded JRE created successfully

更多信息:docs.oracle.com/javase/8/embedded/develop-apps-platforms /

答案 2 :(得分:1)

这种方式似乎有效:

创建一个新的"完整的个人资料"使用jrecreate(默认为在没有给出参数时创建完整的配置文件。)

将java / bean和com / sun / beans从完整的/ lib / rt.jar复制到您的压缩配置文件/lib/rt.jar

编辑/ lib / meta-index文件并添加" / com / sun / beans" (再次,您可以查看"完整"元索引文件并复制该行)