我正在嘗試將我的 .jar 專案轉換為本機映像,因為我需要在不支持 Java 的設備中運行它。為此,我安裝了 GraalVM 和所有必需的依賴項,并且本機映像構建作業完美(或者至少看起來如此,因為它在程序中沒有給出任何錯誤)。
我用于構建的命令是:
/usr/lib/jvm/graalvm/bin/native-image -jar MyApp.jar MyApp --enable-http --enable-https --no-fallback -H: ReportExceptionStackTraces
問題是,當我嘗試運行本機檔案時,我收到一個例外說找不到 log4j 類,因此在執行期間我沒有應用程式日志:
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,如果我嘗試使用另一個不同的 appender,我仍然會得到另一個類的相同錯誤。所以我只是無法弄清楚構建有什么問題。
這是我的 pom.xml 檔案中的所有依賴項:
<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-shade-plugin 配置:
<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>
非常感謝您對此事的任何了解,我已經嘗試解決這個問題好幾天了,但沒有運氣。
先感謝您!
uj5u.com熱心網友回復:
有趣的是,在發布這個問題后不久,我就找到了答案。它與 GraalVM 的反射配置有關。修復實際上非常簡單:
首先你使用一個特殊的 GraalVM 選項運行你的 jar:
<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 原生映像構建:
jni-config.json
predefined-classes-config.json
proxy-config.json
reflect-config.json
resource-config.json
serialization-config.json
擁有這些檔案后,您可以執行構建并將它們作為引數傳遞:
<GRAALVM_HOME>/bin/native-image -jar <JAR_FILE>.jar <NATIVE_IMAGE_NAME> -H:ConfigurationFileDirectories=<DIRECTORY_WHERE_YOUR_JSON_FILES_ARE_AT>
就是這樣!構建完成后,本機映像運行完美,沒有任何問題,所有日志都按預期作業。
如果需要,您還可以將 .json 檔案添加到可從類路徑訪問的 META-INF/native-image 目錄中,例如在 src/main/resources 目錄中。這樣,在呼叫本機映像構建時,您不需要將目錄作為引數傳遞。
我所有這些有用資訊的來源是: https ://simply-how.com/fix-graalvm-native-image-compilation-issues
我希望這可以幫助其他有同樣問題的人:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/429870.html
標籤:爪哇 行家 日志4j slf4j graalvm-native-image
