uap-java icon indicating copy to clipboard operation
uap-java copied to clipboard

SnakeYAML requires the java.desktop module

Open fvasco opened this issue 3 years ago • 1 comments

The java.desktop is a quite huge dependency for a parser, please consider avoiding this dependency or parse the Yaml at compile time (this improves performances too).

java.lang.NoClassDefFoundError: java/beans/IntrospectionException
        at org.yaml.snakeyaml.representer.BaseRepresenter.getPropertyUtils(BaseRepresenter.java:202)
        at org.yaml.snakeyaml.Yaml.initDumperOptions(Yaml.java:120)
        at org.yaml.snakeyaml.Yaml.<init>(Yaml.java:113)
        at org.yaml.snakeyaml.Yaml.<init>(Yaml.java:103)
        at ua_parser.Parser.initialize(Parser.java:80)
        at ua_parser.Parser.<init>(Parser.java:45)
        ...
Caused by: java.lang.ClassNotFoundException: java.beans.IntrospectionException
        at java.base/java.net.URLClassLoader.findClass(Unknown Source)
        at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
        ... 19 common frames omitted

fvasco avatar Nov 16 '21 16:11 fvasco

The new snakeyaml-engine loads regexes.yaml successfully and fixes this issue.

Here is a Kotlin POC

import org.snakeyaml.engine.v2.api.Load
import org.snakeyaml.engine.v2.api.LoadSettings
import ua_parser.UserAgentParser

fun main() {
    val load = Load(LoadSettings.builder().build())
    val regexes = UserAgentParser::class.java.getResourceAsStream("/ua_parser/regexes.yaml")!!.use { stream ->
        load.loadFromString(stream.reader().readText()) as Map<String, *>
    }
    println(regexes["user_agent_parsers"])
}
dependencies {
    api "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    api 'org.snakeyaml:snakeyaml-engine:2.3'
    api 'com.github.ua-parser:uap-java:1.5.2'
}

fvasco avatar Dec 09 '21 14:12 fvasco