在纯模式下运行rest服务时,出现org.apache.commons.logging.impl.LogFactoryImpl类未找到异常。在openjdk模式下运行正常。
我写了一个小服务手册来解决这个问题。
Rest服务:
package org.acme.rest.json;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import io.quarkus.deployment.builditem.substrate.ReflectiveClassBuildItem;
import io.quarkus.deployment.annotations.BuildStep;
@Path("/logs")
public class LogResource {
private Log log = LogFactory.getLog(LogResource.class);
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
log.info("jello");
return "hello";
}
}
调用该文件时,我得到
xception handling request 04cf25a8-aafb-4b2a-978e-47a24009b22d-1 to /logs: org.jboss.resteasy.spi.UnhandledException: org.apache.commons.logging.LogConfigurationException: java.lang.ClassNotFoundException: org.apache.commons.logging.impl.LogFactoryImpl (Caused by java.lang.ClassNotFoundException: org.apache.commons.logging.impl.LogFactoryImpl)
答案 0 :(得分:1)
请使用JBoss Logging而不是Commons Logging:
private static final Logger LOGGER = Logger.getLogger(LogResource.class.getName());
Logger
为org.jboss.logging.Logger
。
Quartz完全负责JBoss日志记录设置。
如果要使用其他日志记录工具,则需要自己进行设置。在您的情况下,您需要注册LogFactoryImpl
以便进行反射,以使其与GraalVM一起使用。
如果您真的不想使用JBoss Logging(我认为这不是一个好主意,因为它具有所需的所有功能),则必须遵循GraalVM文档的说明:https://github.com/oracle/graal/blob/master/substratevm/REFLECTION.md#manual-configuration。
我建议使用@AutomaticFeature
,因为您只需要在应用程序中添加一个类。
如果采用JSON配置方式,则可以在Maven本机映像阶段的配置中通过<additionalBuildArgs>
提供一些其他参数。
答案 1 :(得分:0)
按照您的建议,我使用以下配置使其运行: pom.xml
<build>
<plugins>
<plugin>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-maven-plugin</artifactId>
<version>${quarkus.version}</version>
<executions>
<execution>
<goals>
<goal>native-image</goal>
</goals>
<configuration>
<enableHttpUrlHandler>true</enableHttpUrlHandler>
<additionalBuildArgs>-H:ReflectionConfigurationFiles=/home/dev/repo/quarkus-mailbox-native//src/main/resources/reflectconfig.json,-H:DynamicProxyConfigurationFiles=/home/dev/repo/quarkus-mailbox-native/src/main/resources/dynamicproxy.json</additionalBuildArgs>
</configuration>
</execution>
</executions>
</plugin>
reflect.json
[
{
"name" : "org.apache.commons.logging.impl.LogFactoryImpl",
"allDeclaredConstructors" : true,
"allPublicConstructors" : true,
"allDeclaredMethods" : true,
"allPublicMethods" : true,
"allDeclaredClasses" : true,
"allPublicClasses" : true
},
{
"name" : "java.lang.String",
"allDeclaredConstructors" : true,
"allPublicConstructors" : true,
"allDeclaredMethods" : true,
"allPublicMethods" : true,
"allDeclaredClasses" : true,
"allPublicClasses" : true
},
{
"name" : "org.apache.commons.logging.LogFactory",
"allDeclaredConstructors" : true,
"allPublicConstructors" : true,
"allDeclaredMethods" : true,
"allPublicMethods" : true,
"allDeclaredClasses" : true,
"allPublicClasses" : true
},
{
"name" : "org.apache.commons.logging.impl.SimpleLog",
"allDeclaredConstructors" : true,
"allPublicConstructors" : true,
"allDeclaredMethods" : true,
"allPublicMethods" : true,
"allDeclaredClasses" : true,
"allPublicClasses" : true
}
]
感谢您的帮助。
X。