webbukkit / dynmap

A set of Minecraft mods that provide a real time web-based map system for various Minecraft server implementations.
https://www.reddit.com/r/Dynmap/
Apache License 2.0
2.06k stars 420 forks source link

Server Crash with NoClassDefFoundError when using S3 storage #4051

Closed qe201020335 closed 10 months ago

qe201020335 commented 10 months ago

Issue Description: I followed the wiki to set up my dynmap server to use aws_s3 as storage type. It crashes on start with java.lang.NoClassDefFoundError. I am using CloudFlare R2 and I did make sure the server is working correctly with the default config before I switched to R2.

I have also made a post on the dynmap discord help channel but I did not get any help there. It got somewhat technical as I tried to figure this out. The discord thread

From the log and call stack, I can see it tries to publish static web files to the bucket, and if I understand it correctly, some sort of dependency injection failed and caused the crash. image

Then I look through the related code and I believe the exception is thrown in this function.

https://github.com/webbukkit/s3-lite/blob/be0f3eee4c6f37a0aef01b077048a0c6b5b3e6df/core/src/main/java/io/github/linktosriram/s3lite/core/client/DefaultS3Client.java#L193-L211

    private static S3Exception handleErrorResponse(final ImmutableResponse httpResponse) {
        final HttpStatus status = httpResponse.getStatus();
        if (status.is3xxRedirection()) {
            ...
        } else {
            return httpResponse.getResponseBody()
                .map(inputStream -> {
                    try (final InputStream input = inputStream) {
                        XMLInputFactory fact = XMLInputFactory.newInstance();
                        XMLEventReader rdr = fact.createXMLEventReader(input);
                        ...
                        }
                    } catch (final IOException e) {
                        throw new UncheckedIOException(e);
                    } catch (XMLStreamException e) {
                        throw new RuntimeException(e);
                    }
                })
               ...
        }
    }

In which, XMLInputFactory fact = XMLInputFactory.newInstance(); is causing problems as seen in the stack trace.

Since this is the error handling code for the s3 API, I know my config is probably wrong because it failed to publish the files. However, due to the unhandled error in the "error handling" code, I don't know exactly what is wrong and what is the status code returned from R2.

I have tried multiple JDKs (Oracle, OpenJDK, Microsoft) on both Ubuntu and Windows, and it all crashes with the same exception.

I did some more google searches and I think I found some related issues (i am not sure) https://stackoverflow.com/questions/64979229/eclipse-osgi-java-11-jaxb-and-the-classloader https://stackoverflow.com/questions/72093691/jaxb-with-jdk17-classloader-issues It seems there are some problems with higher versions of jdk. So tried Java 11 and 13 but they can't even load the launcher jar.

Error occurred during initialization of boot layer
java.lang.module.FindException: Error reading module: libraries\cpw\mods\bootstraplauncher\1.1.2\bootstraplauncher-1.1.2.jar
Caused by: java.lang.module.InvalidModuleDescriptorException: Unsupported major.minor version 60.0

I guess I have to use Java 17, and I don't know what to do now.

JurgenKuyper commented 10 months ago

S3 support is preliminary and basic, to quote the dev: the S3 thing is just what I expected to see: the upgrade was a PR that promised to support non AWS S3 implementations, and I made it quite clear that: a) I wasn't going to test the arbitrary number of non-AWS S3 implementations out there, as they cost money and time, and almost nobody uses the feature b) Consequently, it is an experimental and thus unsupported feature - folks can contribute fixes for specific implementations, but actively supporting the dozen plus 'mostly S3 compatible' implementations out there - along with whatever voodoo each of them has, if any, to enable an S3 bucket to act as a web site - is just not practical.

it either works or doesn't according to the guide on the wiki, the dev is not going to fix it as he doesn't have time to, and I don't know where to even start.