我尝试将现有的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广泛用于许多库中。我们还有其他选择吗?
答案 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" (再次,您可以查看"完整"元索引文件并复制该行)