Reloading jars on a running http server.

Tuesday, 20 April 2021 · 6 messages · last reply 30 Apr 2021
RD
Reece Dunn20 Apr 2021 18:44 #
Hi all, I'm working on a Java class that I'm importing into an XQuery, so I can do additional processing on the data that isn't easily expressible in XQuery (or XSLT). In order to get BaseX to pick up a modified version of the jar file I'm building, I'm restarting the BaseX http server. This makes it slower to turn around testing the changes. Is there a better way of doing this? Kind regards, Reece
CG
Christian Grün21 Apr 2021 19:48 #
Hi Reece, If you install your Java code as JAR file in the repository [1], the code will be loaded and unloaded every time when your query is executed. If you get an error message… java.lang.reflect.InaccessibleObjectException: Unable to make field private final jdk.internal.loader.URLClassPath java.net.URLClassLoader.ucp accessible: module java.base does not "opens java.net" to unnamed module @79e2c065 …unloading fails [2], as you’re probably using a more recent version of the JDK, which restricts reflective access to internal variables. You can get around this by adding Java flags at startup time: --add-opens java.base/java.net=ALL-UNNAMED --add-opens java.base/jdk.internal.loader=ALL-UNNAMED Maybe there are better solutions to unload JAR files today. Suggestions are welcome! Hope this helps, Christian [1] https://docs.basex.org/wiki/Repository#Java [2] https://github.com/BaseXdb/basex/blob/master/basex-core/src/main/java/org/basex/util/JarLoader.java#L34
Quoted text · Reece Dunn · 10 lines
On Tue, Apr 20, 2021 at 6:44 PM Reece Dunn <msclrhd at googlemail.com> wrote: > > Hi all, > > I'm working on a Java class that I'm importing into an XQuery, so I can do additional processing on the data that isn't easily expressible in XQuery (or XSLT). In order to get BaseX to pick up a modified version of the jar file I'm building, I'm restarting the BaseX http server. > > This makes it slower to turn around testing the changes. Is there a better way of doing this? > > Kind regards, > Reece
RD
Reece Dunn29 Apr 2021 21:48 #
Hi Christian, Thanks for the response. Unfortunately, I've not been able to get the reloading working. Kind regards, Reece
Quoted text · Christian Grün · 47 lines
On Wed, 21 Apr 2021 at 18:49, Christian Grün <christian.gruen at gmail.com> wrote: > Hi Reece, > > If you install your Java code as JAR file in the repository [1], the > code will be loaded and unloaded every time when your query is > executed. If you get an error message… > > java.lang.reflect.InaccessibleObjectException: Unable to make field > private final jdk.internal.loader.URLClassPath > java.net.URLClassLoader.ucp accessible: module java.base does not > "opens java.net" to unnamed module @79e2c065 > > …unloading fails [2], as you’re probably using a more recent version > of the JDK, which restricts reflective access to internal variables. > You can get around this by adding Java flags at startup time: > > --add-opens java.base/java.net=ALL-UNNAMED > --add-opens java.base/jdk.internal.loader=ALL-UNNAMED > > Maybe there are better solutions to unload JAR files today. > Suggestions are welcome! > > Hope this helps, > Christian > > [1] https://docs.basex.org/wiki/Repository#Java > [2] > https://github.com/BaseXdb/basex/blob/master/basex-core/src/main/java/org/basex/util/JarLoader.java#L34 > > > > On Tue, Apr 20, 2021 at 6:44 PM Reece Dunn <msclrhd at googlemail.com> wrote: > > > > Hi all, > > > > I'm working on a Java class that I'm importing into an XQuery, so I can > do additional processing on the data that isn't easily expressible in > XQuery (or XSLT). In order to get BaseX to pick up a modified version of > the jar file I'm building, I'm restarting the BaseX http server. > > > > This makes it slower to turn around testing the changes. Is there a > better way of doing this? > > > > Kind regards, > > Reece >
CG
Christian Grün30 Apr 2021 08:48 #
Hi Reece, I’m sorry to hear that. Did you build a custom JAR file, or do you encounter problems with the JDK? Cheers, Christian
Quoted text · Reece Dunn · 50 lines
On Thu, Apr 29, 2021 at 9:48 PM Reece Dunn <msclrhd at googlemail.com> wrote: > > Hi Christian, > > Thanks for the response. Unfortunately, I've not been able to get the reloading working. > > Kind regards, > Reece > > On Wed, 21 Apr 2021 at 18:49, Christian Grün <christian.gruen at gmail.com> wrote: >> >> Hi Reece, >> >> If you install your Java code as JAR file in the repository [1], the >> code will be loaded and unloaded every time when your query is >> executed. If you get an error message… >> >> java.lang.reflect.InaccessibleObjectException: Unable to make field >> private final jdk.internal.loader.URLClassPath >> java.net.URLClassLoader.ucp accessible: module java.base does not >> "opens java.net" to unnamed module @79e2c065 >> >> …unloading fails [2], as you’re probably using a more recent version >> of the JDK, which restricts reflective access to internal variables. >> You can get around this by adding Java flags at startup time: >> >> --add-opens java.base/java.net=ALL-UNNAMED >> --add-opens java.base/jdk.internal.loader=ALL-UNNAMED >> >> Maybe there are better solutions to unload JAR files today. >> Suggestions are welcome! >> >> Hope this helps, >> Christian >> >> [1] https://docs.basex.org/wiki/Repository#Java >> [2] https://github.com/BaseXdb/basex/blob/master/basex-core/src/main/java/org/basex/util/JarLoader.java#L34 >> >> >> >> On Tue, Apr 20, 2021 at 6:44 PM Reece Dunn <msclrhd at googlemail.com> wrote: >> > >> > Hi all, >> > >> > I'm working on a Java class that I'm importing into an XQuery, so I can do additional processing on the data that isn't easily expressible in XQuery (or XSLT). In order to get BaseX to pick up a modified version of the jar file I'm building, I'm restarting the BaseX http server. >> > >> > This makes it slower to turn around testing the changes. Is there a better way of doing this? >> > >> > Kind regards, >> > Reece
RD
Reece Dunn30 Apr 2021 09:14 #
Hi Christian, I'm not seeing any exceptions in the console window, even when enabling the debug setting. I'm using the AdoptOpenJDK 1.8. I also have AdoptOpenJDK 11, but I assume that will have the issue you described. It's a custom-built jar using Kotlin, built via gradle. One thing that it could be is that I'm using Kotlin objects (not classes), e.g.: package test object Test { fun f(): String = "test" } and using it like:
    declare namespace Test = "java:test.Test";

    declare function test:f() as xs:string {
        Test::f(Test::INSTANCE())
    };
The build.gradle file is simple. It looks something like this (removing things like the junit configuration): ----- buildscript { ext.kotlin_version = "1.4.32" ext.kotlin_stdlib = "kotlin-stdlib" ext.java_version = "1.8"
    repositories { mavenCentral() }
    dependencies { classpath
"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" }
}
apply plugin: 'kotlin'
repositories {
    mavenCentral()
    mavenLocal()
}

compileKotlin { kotlinOptions { jvmTarget = java_version } }
compileTestKotlin { kotlinOptions { jvmTarget = java_version } }

dependencies {
    implementation "org.jetbrains.kotlin:$kotlin_stdlib:$kotlin_version"
}
-----
You'll need to copy the kotlin-stdlib-1.4.32.jar file in addition to the test.jar file to BaseX's lib directory. Kind regards, Reece
Quoted text · Christian Grün · 71 lines
On Fri, 30 Apr 2021 at 07:48, Christian Grün <christian.gruen at gmail.com> wrote: > Hi Reece, > > I’m sorry to hear that. Did you build a custom JAR file, or do you > encounter problems with the JDK? > > Cheers, > Christian > > > > On Thu, Apr 29, 2021 at 9:48 PM Reece Dunn <msclrhd at googlemail.com> wrote: > > > > Hi Christian, > > > > Thanks for the response. Unfortunately, I've not been able to get the > reloading working. > > > > Kind regards, > > Reece > > > > On Wed, 21 Apr 2021 at 18:49, Christian Grün <christian.gruen at gmail.com> > wrote: > >> > >> Hi Reece, > >> > >> If you install your Java code as JAR file in the repository [1], the > >> code will be loaded and unloaded every time when your query is > >> executed. If you get an error message… > >> > >> java.lang.reflect.InaccessibleObjectException: Unable to make field > >> private final jdk.internal.loader.URLClassPath > >> java.net.URLClassLoader.ucp accessible: module java.base does not > >> "opens java.net" to unnamed module @79e2c065 > >> > >> …unloading fails [2], as you’re probably using a more recent version > >> of the JDK, which restricts reflective access to internal variables. > >> You can get around this by adding Java flags at startup time: > >> > >> --add-opens java.base/java.net=ALL-UNNAMED > >> --add-opens java.base/jdk.internal.loader=ALL-UNNAMED > >> > >> Maybe there are better solutions to unload JAR files today. > >> Suggestions are welcome! > >> > >> Hope this helps, > >> Christian > >> > >> [1] https://docs.basex.org/wiki/Repository#Java > >> [2] > https://github.com/BaseXdb/basex/blob/master/basex-core/src/main/java/org/basex/util/JarLoader.java#L34 > >> > >> > >> > >> On Tue, Apr 20, 2021 at 6:44 PM Reece Dunn <msclrhd at googlemail.com> > wrote: > >> > > >> > Hi all, > >> > > >> > I'm working on a Java class that I'm importing into an XQuery, so I > can do additional processing on the data that isn't easily expressible in > XQuery (or XSLT). In order to get BaseX to pick up a modified version of > the jar file I'm building, I'm restarting the BaseX http server. > >> > > >> > This makes it slower to turn around testing the changes. Is there a > better way of doing this? > >> > > >> > Kind regards, > >> > Reece >
CG
Christian Grün30 Apr 2021 09:30 #
Hi Reece,
Quoted text · Reece Dunn · 1 line
> You'll need to copy the kotlin-stdlib-1.4.32.jar file in addition to the test.jar file to BaseX's lib directory.
Please note that JAR libraries will only be unregistered after query evalution if they are moved into the repo directory. If a library is copied into the lib directory, it will be added to the static classpath. In the given case, you could probably keep kotlin-stdlib-1.4.32.jar in the lib directory, but you’ll need to keep your development code in the repository (as described in the Wiki). It’s no problem, though, to directly modify the repo code (you don’t have to use REPO INSTALL or repo:install for that). If the problem persists, feel free to send me a little test.jar, I can then do further testing. Hope this helps, Christian
Quoted text · Reece Dunn · 115 lines
On Fri, Apr 30, 2021 at 9:14 AM Reece Dunn <msclrhd at googlemail.com> wrote: > > Hi Christian, > > I'm not seeing any exceptions in the console window, even when enabling the debug setting. I'm using the AdoptOpenJDK 1.8. I also have AdoptOpenJDK 11, but I assume that will have the issue you described. > > It's a custom-built jar using Kotlin, built via gradle. > > One thing that it could be is that I'm using Kotlin objects (not classes), e.g.: > > package test > object Test { fun f(): String = "test" } > > and using it like: > > declare namespace Test = "java:test.Test"; > > declare function test:f() as xs:string { > Test::f(Test::INSTANCE()) > }; > > The build.gradle file is simple. It looks something like this (removing things like the junit configuration): > > ----- > buildscript { > ext.kotlin_version = "1.4.32" > ext.kotlin_stdlib = "kotlin-stdlib" > ext.java_version = "1.8" > > repositories { mavenCentral() } > dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } > } > > apply plugin: 'kotlin' > > repositories { > mavenCentral() > mavenLocal() > } > > compileKotlin { kotlinOptions { jvmTarget = java_version } } > compileTestKotlin { kotlinOptions { jvmTarget = java_version } } > > dependencies { > implementation "org.jetbrains.kotlin:$kotlin_stdlib:$kotlin_version" > } > ----- > > You'll need to copy the kotlin-stdlib-1.4.32.jar file in addition to the test.jar file to BaseX's lib directory. > > Kind regards, > Reece > > On Fri, 30 Apr 2021 at 07:48, Christian Grün <christian.gruen at gmail.com> wrote: >> >> Hi Reece, >> >> I’m sorry to hear that. Did you build a custom JAR file, or do you >> encounter problems with the JDK? >> >> Cheers, >> Christian >> >> >> >> On Thu, Apr 29, 2021 at 9:48 PM Reece Dunn <msclrhd at googlemail.com> wrote: >> > >> > Hi Christian, >> > >> > Thanks for the response. Unfortunately, I've not been able to get the reloading working. >> > >> > Kind regards, >> > Reece >> > >> > On Wed, 21 Apr 2021 at 18:49, Christian Grün <christian.gruen at gmail.com> wrote: >> >> >> >> Hi Reece, >> >> >> >> If you install your Java code as JAR file in the repository [1], the >> >> code will be loaded and unloaded every time when your query is >> >> executed. If you get an error message… >> >> >> >> java.lang.reflect.InaccessibleObjectException: Unable to make field >> >> private final jdk.internal.loader.URLClassPath >> >> java.net.URLClassLoader.ucp accessible: module java.base does not >> >> "opens java.net" to unnamed module @79e2c065 >> >> >> >> …unloading fails [2], as you’re probably using a more recent version >> >> of the JDK, which restricts reflective access to internal variables. >> >> You can get around this by adding Java flags at startup time: >> >> >> >> --add-opens java.base/java.net=ALL-UNNAMED >> >> --add-opens java.base/jdk.internal.loader=ALL-UNNAMED >> >> >> >> Maybe there are better solutions to unload JAR files today. >> >> Suggestions are welcome! >> >> >> >> Hope this helps, >> >> Christian >> >> >> >> [1] https://docs.basex.org/wiki/Repository#Java >> >> [2] https://github.com/BaseXdb/basex/blob/master/basex-core/src/main/java/org/basex/util/JarLoader.java#L34 >> >> >> >> >> >> >> >> On Tue, Apr 20, 2021 at 6:44 PM Reece Dunn <msclrhd at googlemail.com> wrote: >> >> > >> >> > Hi all, >> >> > >> >> > I'm working on a Java class that I'm importing into an XQuery, so I can do additional processing on the data that isn't easily expressible in XQuery (or XSLT). In order to get BaseX to pick up a modified version of the jar file I'm building, I'm restarting the BaseX http server. >> >> > >> >> > This makes it slower to turn around testing the changes. Is there a better way of doing this? >> >> > >> >> > Kind regards, >> >> > Reece

⚡Generated with XQuery