如何修复在纯模式下找不到的“ org.apache.commons.logging.impl.LogFactoryImpl”

时间:2019-07-03 13:14:42

标签: apache-commons-logging quarkus

在纯模式下运行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)

2 个答案:

答案 0 :(得分:1)

请使用JBoss Logging而不是Commons Logging:

private static final Logger LOGGER = Logger.getLogger(LogResource.class.getName());

Loggerorg.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。