I have a small kotlin project using Javalin and JTE as a renderer. The project is managed with maven and below is the pom.xml.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi=";
xmlns=".0.0"
xsi:schemaLocation=".0.0 .0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>tech.bobdudan</groupId>
<artifactId>recipes</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<kotlin.code.style>official</kotlin.code.style>
<kotlinpiler.jvmTarget>21</kotlinpiler.jvmTarget>
</properties>
<repositories>
<repository>
<id>mavenCentral</id>
<url>/</url>
</repository>
</repositories>
<build>
<sourceDirectory>src/main/kotlin</sourceDirectory>
<testSourceDirectory>src/test/kotlin</testSourceDirectory>
<plugins>
<plugin>
<groupId>.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>1.9.23</version>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
</plugin>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.22.2</version>
</plugin>
<plugin>
<groupId>.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<configuration>
<mainClass>tech.bobdudan.recipes.AppKt</mainClass>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>io.javalin</groupId>
<artifactId>javalin</artifactId>
<version>6.4.0</version>
</dependency>
<dependency>
<groupId>io.javalin</groupId>
<artifactId>javalin-rendering</artifactId>
<version>6.4.0</version>
</dependency>
<dependency>
<groupId>.eclipse.angus</groupId>
<artifactId>angus-mail</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>gg.jte</groupId>
<artifactId>jte</artifactId>
<version>3.1.16</version>
</dependency>
<dependency>
<groupId>gg.jte</groupId>
<artifactId>jte-kotlin</artifactId>
<version>3.1.16</version>
</dependency>
<dependency>
<groupId>.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.7.5</version>
</dependency>
<dependency>
<groupId>.ktorm</groupId>
<artifactId>ktorm-support-postgresql</artifactId>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>.ktorm</groupId>
<artifactId>ktorm-core</artifactId>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>2.0.16</version>
</dependency>
<dependency>
<groupId>.jetbrains.kotlin</groupId>
<artifactId>kotlin-test-junit5</artifactId>
<version>1.9.23</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.10.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>1.9.23</version>
</dependency>
</dependencies>
</project>
When I run it in my IDE (IntelliJ IDEA) I have no issue. However, when I build it and run it using maven in the cli (mvn clean install
and then mvn exec:java
), the server starts correctly and handles correctly static ressources (like images or css files), but throws the following error when rendering a jte template :
[JettyServerThreadPool-42] ERROR io.javalin.Javalin - Fatal error occurred while servicing http-request
java.lang.NoClassDefFoundError: gg/jte/html/HtmlTemplateOutput
at java.base/java.lang.Class.getDeclaredMethods0(Native Method)
at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3578)
at java.base/java.lang.Class.getDeclaredMethods(Class.java:2676)
at gg.jte.runtime.Template.findRenderMethods(Template.java:69)
at gg.jte.runtime.Template.<init>(Template.java:26)
at gg.jte.runtime.TemplateLoader.load(TemplateLoader.java:26)
at gg.jtepiler.TemplateCompiler.load(TemplateCompiler.java:51)
at gg.jte.TemplateEngine.lambda$resolveTemplateOnDemand$0(TemplateEngine.java:354)
at java.base/java.util.concurrent.ConcurrentHashMappute(ConcurrentHashMap.java:1916)
at gg.jte.TemplateEngine.resolveTemplateOnDemand(TemplateEngine.java:347)
at gg.jte.TemplateEngine.resolveTemplate(TemplateEngine.java:337)
at gg.jte.TemplateEngine.render(TemplateEngine.java:228)
at io.javalin.rendering.template.JavalinJte.render(JavalinJte.kt:38)
at io.javalin.http.Context.render(Context.kt:509)
at tech.bobdudan.recipes.infrastruture.controller.RecipeController.serveList$lambda$0(RecipeController.kt:18)
at io.javalin.router.Endpoint.handle(Endpoint.kt:52)
at io.javalin.router.ParsedEndpoint.handle(ParsedEndpoint.kt:15)
at io.javalin.http.servlet.DefaultTasks.HTTP$lambda$9$lambda$7$lambda$6(DefaultTasks.kt:52)
at io.javalin.http.servlet.JavalinServlet.handleTask(JavalinServlet.kt:99)
at io.javalin.http.servlet.JavalinServlet.handleSync(JavalinServlet.kt:64)
at io.javalin.http.servlet.JavalinServlet.handle(JavalinServlet.kt:50)
at io.javalin.http.servlet.JavalinServlet.service(JavalinServlet.kt:30)
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:587)
at io.javalin.jetty.JavalinJettyServlet.service(JavalinJettyServlet.kt:52)
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:587)
at .eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:764)
at .eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:529)
at .eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:221)
at .eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1580)
at .eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:221)
at .eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1381)
at .eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:176)
at .eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:484)
at .eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1553)
at .eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:174)
at .eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1303)
at .eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:129)
at .eclipse.jetty.server.handler.StatisticsHandler.handle(StatisticsHandler.java:173)
at .eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:122)
at .eclipse.jetty.server.Server.handle(Server.java:563)
at .eclipse.jetty.server.HttpChannel$RequestDispatchable.dispatch(HttpChannel.java:1598)
at .eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:753)
at .eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:501)
at .eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:287)
at .eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:314)
at .eclipse.jetty.io.FillInterest.fillable(FillInterest.java:100)
at .eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:53)
at .eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:969)
at .eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1194)
at .eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1149)
at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: java.lang.ClassNotFoundException: gg.jte.html.HtmlTemplateOutput
at java.base/java.URLClassLoader.findClass(URLClassLoader.java:445)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:593)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
... 51 more
What am I mising here ?
I have a small kotlin project using Javalin and JTE as a renderer. The project is managed with maven and below is the pom.xml.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3./2001/XMLSchema-instance"
xmlns="http://maven.apache./POM/4.0.0"
xsi:schemaLocation="http://maven.apache./POM/4.0.0 http://maven.apache./xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>tech.bobdudan</groupId>
<artifactId>recipes</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<kotlin.code.style>official</kotlin.code.style>
<kotlinpiler.jvmTarget>21</kotlinpiler.jvmTarget>
</properties>
<repositories>
<repository>
<id>mavenCentral</id>
<url>https://repo1.maven./maven2/</url>
</repository>
</repositories>
<build>
<sourceDirectory>src/main/kotlin</sourceDirectory>
<testSourceDirectory>src/test/kotlin</testSourceDirectory>
<plugins>
<plugin>
<groupId>.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>1.9.23</version>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
</plugin>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.22.2</version>
</plugin>
<plugin>
<groupId>.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<configuration>
<mainClass>tech.bobdudan.recipes.AppKt</mainClass>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>io.javalin</groupId>
<artifactId>javalin</artifactId>
<version>6.4.0</version>
</dependency>
<dependency>
<groupId>io.javalin</groupId>
<artifactId>javalin-rendering</artifactId>
<version>6.4.0</version>
</dependency>
<dependency>
<groupId>.eclipse.angus</groupId>
<artifactId>angus-mail</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>gg.jte</groupId>
<artifactId>jte</artifactId>
<version>3.1.16</version>
</dependency>
<dependency>
<groupId>gg.jte</groupId>
<artifactId>jte-kotlin</artifactId>
<version>3.1.16</version>
</dependency>
<dependency>
<groupId>.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.7.5</version>
</dependency>
<dependency>
<groupId>.ktorm</groupId>
<artifactId>ktorm-support-postgresql</artifactId>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>.ktorm</groupId>
<artifactId>ktorm-core</artifactId>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>2.0.16</version>
</dependency>
<dependency>
<groupId>.jetbrains.kotlin</groupId>
<artifactId>kotlin-test-junit5</artifactId>
<version>1.9.23</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.10.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>1.9.23</version>
</dependency>
</dependencies>
</project>
When I run it in my IDE (IntelliJ IDEA) I have no issue. However, when I build it and run it using maven in the cli (mvn clean install
and then mvn exec:java
), the server starts correctly and handles correctly static ressources (like images or css files), but throws the following error when rendering a jte template :
[JettyServerThreadPool-42] ERROR io.javalin.Javalin - Fatal error occurred while servicing http-request
java.lang.NoClassDefFoundError: gg/jte/html/HtmlTemplateOutput
at java.base/java.lang.Class.getDeclaredMethods0(Native Method)
at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3578)
at java.base/java.lang.Class.getDeclaredMethods(Class.java:2676)
at gg.jte.runtime.Template.findRenderMethods(Template.java:69)
at gg.jte.runtime.Template.<init>(Template.java:26)
at gg.jte.runtime.TemplateLoader.load(TemplateLoader.java:26)
at gg.jtepiler.TemplateCompiler.load(TemplateCompiler.java:51)
at gg.jte.TemplateEngine.lambda$resolveTemplateOnDemand$0(TemplateEngine.java:354)
at java.base/java.util.concurrent.ConcurrentHashMappute(ConcurrentHashMap.java:1916)
at gg.jte.TemplateEngine.resolveTemplateOnDemand(TemplateEngine.java:347)
at gg.jte.TemplateEngine.resolveTemplate(TemplateEngine.java:337)
at gg.jte.TemplateEngine.render(TemplateEngine.java:228)
at io.javalin.rendering.template.JavalinJte.render(JavalinJte.kt:38)
at io.javalin.http.Context.render(Context.kt:509)
at tech.bobdudan.recipes.infrastruture.controller.RecipeController.serveList$lambda$0(RecipeController.kt:18)
at io.javalin.router.Endpoint.handle(Endpoint.kt:52)
at io.javalin.router.ParsedEndpoint.handle(ParsedEndpoint.kt:15)
at io.javalin.http.servlet.DefaultTasks.HTTP$lambda$9$lambda$7$lambda$6(DefaultTasks.kt:52)
at io.javalin.http.servlet.JavalinServlet.handleTask(JavalinServlet.kt:99)
at io.javalin.http.servlet.JavalinServlet.handleSync(JavalinServlet.kt:64)
at io.javalin.http.servlet.JavalinServlet.handle(JavalinServlet.kt:50)
at io.javalin.http.servlet.JavalinServlet.service(JavalinServlet.kt:30)
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:587)
at io.javalin.jetty.JavalinJettyServlet.service(JavalinJettyServlet.kt:52)
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:587)
at .eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:764)
at .eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:529)
at .eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:221)
at .eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1580)
at .eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:221)
at .eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1381)
at .eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:176)
at .eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:484)
at .eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1553)
at .eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:174)
at .eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1303)
at .eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:129)
at .eclipse.jetty.server.handler.StatisticsHandler.handle(StatisticsHandler.java:173)
at .eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:122)
at .eclipse.jetty.server.Server.handle(Server.java:563)
at .eclipse.jetty.server.HttpChannel$RequestDispatchable.dispatch(HttpChannel.java:1598)
at .eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:753)
at .eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:501)
at .eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:287)
at .eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:314)
at .eclipse.jetty.io.FillInterest.fillable(FillInterest.java:100)
at .eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:53)
at .eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:969)
at .eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1194)
at .eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1149)
at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: java.lang.ClassNotFoundException: gg.jte.html.HtmlTemplateOutput
at java.base/java.URLClassLoader.findClass(URLClassLoader.java:445)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:593)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
... 51 more
What am I mising here ?
Share Improve this question asked Jan 29 at 9:25 Bob DudanBob Dudan 973 silver badges9 bronze badges1 Answer
Reset to default 0You must be using IntelliJ jte plugin, which takes care of generating source, precompiling, etc. Hence it works fine in IDE.
To build and run using CLI, you can configure the maven plugin for jte.
Refer to this possibly related issue.