Search code examples
javanlpslf4jopennlp

Why does OpenNLP CLI output "SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder" on Windows?


Based on Apache OpenNLP documentation, I downloaded binary version of OpenNLP, then set JAVA_HOME and OPENNLP_HOME. When I run opennlp command it faced to below exception:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

I used windows operating system and tried this command on different systems with different versions of Java, but always this exception is shown. It is too odd, because I've searched and no one faced this issued before.

enter image description here


Solution

  • You found a bug. Congratulation! I created OPENNLP-1527 for it.

    Meanwhile, you can override the content of the opennlp.bat file with

    @ECHO off
    
    REM #   Licensed to the Apache Software Foundation (ASF) under one
    REM #   or more contributor license agreements.  See the NOTICE file
    REM #   distributed with this work for additional information
    REM #   regarding copyright ownership.  The ASF licenses this file
    REM #   to you under the Apache License, Version 2.0 (the
    REM #   "License"); you may not use this file except in compliance
    REM #   with the License.  You may obtain a copy of the License at
    REM #
    REM #    http://www.apache.org/licenses/LICENSE-2.0
    REM #
    REM #   Unless required by applicable law or agreed to in writing,
    REM #   software distributed under the License is distributed on an
    REM #   #  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    REM #   KIND, either express or implied.  See the License for the
    REM #   specific language governing permissions and limitations
    REM #   under the License.
    
    REM # Note:  Do not output anything in this script file, any output
    REM #        may be inadvertantly placed in any output files if
    REM #        output redirection is used.
    SETLOCAL
    
    IF "%JAVA_CMD%" == "" (
        IF "%JAVA_HOME%" == "" (
            SET JAVA_CMD=java 
        ) ELSE (
            REM # Keep JAVA_HOME to short-name without spaces
            FOR %%A IN ("%JAVA_HOME%") DO SET JAVA_CMD=%%~sfA\bin\java
        )
    )
    
    REM remove HEAP variable
    SET HEAP=
    IF not "%JAVA_HEAP%" == "" (
        SET HEAP="-Xmx%JAVA_HEAP%"
    )
    
    REM #  Should work with Windows XP and greater.  If not, specify the path to where it is installed.
    IF "%OPENNLP_HOME%" == "" (
        SET OPENNLP_HOME=%~sp0..
    ) ELSE (
        REM # Keep OPENNLP_HOME to short-name without spaces
        FOR %%A IN ("%OPENNLP_HOME%") DO SET OPENNLP_HOME=%%~sfA
    )
    
    echo Environment
    echo JAVA_HOME=%JAVA_HOME%
    echo OPENNLP_HOME=%OPENNLP_HOME% 
    
    REM Add lib directory to the classpath
    SET CLASSPATH="%OPENNLP_HOME%\lib\*"
    
    echo CLASSPATH=%CLASSPATH%
    
    %JAVA_CMD% %HEAP% "-Dlog4j.configurationFile=%OPENNLP_HOME%\conf\log4j2.xml" -cp %CLASSPATH% opennlp.tools.cmdline.CLI %*
    
    ENDLOCAL
    

    This will correctly append the classes contained in the lib folder to the classpath and the cli will work as expected.