首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >GraalVM本机映像生成找不到log4j附录类。

GraalVM本机映像生成找不到log4j附录类。
EN

Stack Overflow用户
提问于 2022-02-16 09:12:55
回答 1查看 894关注 0票数 2

我正在尝试将我的.jar项目转换成一个本机映像,因为我需要在一个不支持Java的设备中运行它。为此,我安装了GraalVM和所有所需的依赖项,以及本机映像构建工作得很好(或者至少看起来是这样,因为它在过程中不会出现任何错误)。

我在构建中使用的命令是:

/usr/lib/jvm/graalvm/bin/本机-映像-jar MyApp.jar MyApp -启用-http-启用-https-无后备-H:+ReportExceptionStackTraces

问题是,当我试图运行本机文件时,我会得到一个异常,说明找不到log4j类,因此在执行过程中没有应用程序日志:

代码语言:javascript
运行
AI代码解释
复制
log4j:ERROR Could not instantiate class [org.apache.log4j.RollingFileAppender].
java.lang.ClassNotFoundException: org.apache.log4j.RollingFileAppender
        at java.lang.Class.forName(DynamicHub.java:1338)
        at java.lang.Class.forName(DynamicHub.java:1313)
        at org.apache.log4j.helpers.Loader.loadClass(Loader.java:198)
        at org.apache.log4j.helpers.OptionConverter.instantiateByClassName(OptionConverter.java:327)
        at org.apache.log4j.helpers.OptionConverter.instantiateByKey(OptionConverter.java:124)
        at org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:785)
        at org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:768)
        at org.apache.log4j.PropertyConfigurator.configureRootCategory(PropertyConfigurator.java:648)
        at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:514)
        at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:580)
        at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:526)
        at org.apache.log4j.LogManager.<clinit>(LogManager.java:127)
        at org.slf4j.impl.Log4jLoggerFactory.<init>(Log4jLoggerFactory.java:66)
        at org.slf4j.impl.StaticLoggerBinder.<init>(StaticLoggerBinder.java:72)
        at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:45)
        at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
        at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)
        at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412)
        at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357)
        at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:383)
        at com.test.MyApp.<clinit>(MyApp.java:40)
log4j:ERROR Could not instantiate appender named "file".
log4j:WARN No appenders could be found for logger (com.test.MyApp).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

当我通过java .jar运行-jar时,它工作得很好。提取jar后,我可以看到它中的所有log4j文件,包括RollingFileAppender类,它会产生错误(它是一个阴影jar)。问题不仅在于RollingFileAppender,如果我尝试使用另一个不同的附录,对于另一个类,我仍然会得到相同的错误。所以我不知道这个建筑有什么问题。

下面是我的pom.xml文件中的所有依赖项:

代码语言:javascript
运行
AI代码解释
复制
    <dependencies>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.3.2</version>
        </dependency>       
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.25</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-jaxrs</artifactId>
            <version>3.0.19.Final</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-jackson2-provider</artifactId>
            <version>3.0.19.Final</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-client</artifactId>
            <version>3.0.19.Final</version>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>

        (These last 2 were not in the original project, I tried adding them to see if it'd help but nothing changed, still get the same error)
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>apache-log4j-extras</artifactId>
            <version>1.2.17</version>
        </dependency>
    </dependencies>

还有我的maven-阴影插件配置:

代码语言:javascript
运行
AI代码解释
复制
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.4</version>
            <executions>
              <execution>
                <phase>package</phase>
                <goals>
                  <goal>shade</goal>
                </goals>
              </execution>
            </executions>
          </plugin>

任何关于这件事的建议都会受到极大的感谢,我几天来一直在设法解决这个问题,却没有任何运气。

提前谢谢你!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-16 10:12:10

有趣的是,在贴出这个问题后不久,我找到了答案。它与GraalVM的反射配置有关。修复方法实际上非常简单:

首先,使用一个特殊的GraalVM选项运行jar:

代码语言:javascript
运行
AI代码解释
复制
<GRAALVM_HOME>/bin/java -agentlib:native-image-agent=config-output-dir=<DIRECTORY_YOU_WANT_THE_FILES_TO_BE_GERERATED_AT> -jar <JAR_FILE>.jar

这将生成一组.json文件,这些文件将帮助配置GraalVM本机映像构建:

代码语言:javascript
运行
AI代码解释
复制
jni-config.json
predefined-classes-config.json
proxy-config.json
reflect-config.json
resource-config.json
serialization-config.json

一旦有了这些文件,就可以执行将它们作为参数传递的构建:

代码语言:javascript
运行
AI代码解释
复制
<GRAALVM_HOME>/bin/native-image -jar <JAR_FILE>.jar <NATIVE_IMAGE_NAME> -H:ConfigurationFileDirectories=<DIRECTORY_WHERE_YOUR_JSON_FILES_ARE_AT>

就这样!构建完成后,本机映像完美地运行,没有任何问题,所有日志都按预期工作。

如果需要,还可以将.json文件添加到从类路径访问的main/本机映像目录中,例如在src/main/resources目录中。这样,在调用本机映像构建时,不需要将目录作为参数传递。

我所有这些有用信息的来源是:https://simply-how.com/fix-graalvm-native-image-compilation-issues

我希望这能帮助其他人解决同样的问题:)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71146331

复制
相关文章
如何修复Vue中的 “this is undefined” 问题
别担心,不只有你一个人,我也经常遇到这个问题很多次,接下我们一起来看看如何解决这个问题。
前端小智@大迁世界
2020/05/12
5.1K0
Django 中如何优雅的记录日志
日志是个好东西,但却并不是所有人都愿意记,直到出了问题才追悔莫及,长叹一声,当初要是记日志就好了。
AlwaysBeta
2020/11/11
1.9K0
如何修复Windows 10中损坏的系统文件!
相信大家用电脑的都遇到过这样的情况:电脑在启动过程中感觉有问题或遇到问题,这时候则Windows系统文件可能已损坏,丢失,甚至已被某个软件安装更改。与之前的大多数Windows版本一样,Windows 10包含一个名为「SFC」的命令提示实用程序,它将扫描,验证和修复系统文件。
FreeRonin
2019/08/22
9.7K0
django 1.8 官方文档翻译: 3-4-3 使用基于类的视图处理表单
你自己实现这些功能经常导致许多重复的样本代码(参见在视图中使用表单)。为了避免这点,Django 提供一系列的通用的基于类的视图用于表单的处理。
ApacheCN_飞龙
2022/11/27
1.9K0
基于OpenCV修复表格缺失的轮廓--如何识别和修复表格识别中的虚线
通过扫描或照片对文档进行数字化处理时,错误的设置或不良的条件可能会影响图像质量。在识别的情况下,这可能导致表结构损坏。某些图标的处理结果可能只是有轻微的瑕疵,甚至只是一些小孔,但是无法将其识别为连贯的系统。有时在创建在单元格时,表的某些侧面可能也没有线的存在。表和单元格类型多种多样,因此通常所提出的代码可能并不适合所有情况。尽管如此,如果我们能对提取的表格进行少量修改,大部分程序仍然可以使用。大多数表格识别算法是基于表格的结构。由于没有完整的边线会使一些单元格无法被识别,导致不良的识别率,因此我们需要想办法修复这些丢失的线段。
AI算法与图像处理
2021/01/20
4.4K0
基于OpenCV修复表格缺失的轮廓--如何识别和修复表格识别中的虚线
通过扫描或照片对文档进行数字化处理时,错误的设置或不良的条件可能会影响图像质量。在识别的情况下,这可能导致表结构损坏。某些图标的处理结果可能只是有轻微的瑕疵,甚至只是一些小孔,但是无法将其识别为连贯的系统。有时在创建在单元格时,表的某些侧面可能也没有线的存在。表和单元格类型多种多样,因此通常所提出的代码可能并不适合所有情况。尽管如此,如果我们能对提取的表格进行少量修改,大部分程序仍然可以使用。大多数表格识别算法是基于表格的结构。由于没有完整的边线会使一些单元格无法被识别,导致不良的识别率,因此我们需要想办法修复这些丢失的线段。
小白学视觉
2021/01/21
4.7K0
如何使用Python中Django模板?
https://www.mattlayman.com/understand-django/templates-user-interfaces/
程序员小猿
2021/01/19
4K0
如何使用Python中Django模板?
PrestaShop 网站漏洞修复如何修复
PrestaShop网站的漏洞越来越多,该网站系统是很多外贸网站在使用的一个开源系统,从之前的1.0初始版本到现在的1.7版本,经历了多次的升级,系统使用的人也越来越多,国内使用该系统的外贸公司也很多,PrestaShop扩展性较高,模板也多,多种货币自由切换,并支持信用卡以及paypal支付,是外贸网站的首选。就在最近几天,PrestaShop被爆出有远程代码注入漏洞,该漏洞影响范围较光,危害较大,可以上传webshell到网站根目录下。
网站安全专家
2019/07/24
4.2K0
PrestaShop 网站漏洞修复如何修复
PrestaShop网站的漏洞越来越多,该网站系统是很多外贸网站在使用的一个开源系统,从之前的1.0初始版本到现在的1.7版本,经历了多次的升级,系统使用的人也越来越多,国内使用该系统的外贸公司也很多,PrestaShop扩展性较高,模板也多,多种货币自由切换,并支持信用卡以及paypal支付,是外贸网站的首选。就在最近几天,PrestaShop被爆出有远程代码注入漏洞,该漏洞影响范围较光,危害较大,可以上传webshell到网站根目录下。
技术分享达人
2019/01/01
4.1K0
Django 教程 --- Django中的视图
Django视图是Django M V T结构的重要参与者之一。视图是用户界面,即您呈现网站时在浏览器中看到的内容。它由HTML / CSS / Javascript和Jinja文件表示。根据Django文档,视图函数是一个Python函数,它接受Web请求并返回Web响应。此响应可以是网页的HTML内容,重定向,404错误,XML文档或图像(Web浏览器可以显示的任何内容)
公众号---人生代码
2020/05/26
3.1K0
Django 教程 --- Django中的视图
Android中的热修复
在运行时替换掉底层有Bug的方法的地址,将他们的指针指向修复之后的方法的内存地址,从而实现热修复的功能。
码农帮派
2021/02/25
2.1K1
Android中的热修复
为何Keras中的CNN是有问题的,如何修复它们?
上个星期我做了一些实验,用了在 CIFAR10 数据集上训练的 VGG16。我需要从零开始训练模型,所以没有使用在 ImageNet 上预训练的版本。
机器之心
2019/07/18
3K0
为何Keras中的CNN是有问题的,如何修复它们?
为何Keras中的CNN是有问题的,如何修复它们?
上个星期我做了一些实验,用了在 CIFAR10 数据集上训练的 VGG16。我需要从零开始训练模型,所以没有使用在 ImageNet 上预训练的版本。
磐创AI
2019/07/23
2.9K0
为何Keras中的CNN是有问题的,如何修复它们?
如何在MySQL中检查和修复MyISAM表
由于写入不完整,空间不足,MySQL守护程序被杀或崩溃,电源故障等原因,MySQL表可能因各种原因而损坏。 如果MySQL检测到崩溃或损坏的表,则需要先修复它才能再次使用。 本指南将引导您检测崩溃的表以及如何修复MyISAM表。
星哥玩云
2022/08/17
2.3K0
django中ModelForm多表单组合的解决方案
django是Python语言快速实现web服务的大杀器,其开发效率可以非常的高!但因为秉承了语言的灵活性,django框架又太灵活,以至于想实现任何功能都有种“条条大路通罗马”的感觉。这么多种选择放在一起,如何分出高下?我想此时的场景下就两个标准:
陶辉
2019/06/21
3.5K0
利用Django通用类视图(class
最近在学习Django,官方文档介绍地十分详细。但是“大而全”就难免会有些不够速成,和我们这个浮躁的互联网时代格格不入,所以我就整理了这个文档。就像coolshell说的,一泡屎的时间就可以看完。
py3study
2020/01/03
1.5K0
Django中的QuerySet
  查询集,类似一个列表,包含了满足查询条件的所有项。QuerySet 可以被构造,过滤,切片,做为参数传递,这些行为都不会对数据库进行操作。只有你查询的时候才真正的操作数据库。意味着QuerySet是惰性执行的----即创建查询集不会带来任何的数据库访问,直到查询集需要求值的时候,Django才会真正运行这个查询。
forxtz
2020/10/10
1.4K0
点击加载更多

相似问题

运行在Google应用引擎上的Python应用程序。如何调用Google?

14

heroku上的Google认证

11

Rails 3: Google应用程序/ Heroku的SMTP设置

41

如何在Heroku上配置Google?

10

Google App Engine上的Golang应用程序调用Python脚本

112
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档