Не работает простой проект на Tapestry 4
Пытаюсь собрать простейший проект на Tapestry 4.1 (Нужно именно 4.1-4.1.6) и разместить его сервлет на Tomcat.
│ .gitignore
│ pom.xml
│
├───.idea
│ ...
│
└───src
└───main
├───java
│ └───ru
│ └───tapestrytest
│ ├───data
│ │ TestProject.java
│ │
│ ├───pages
│ │ Edit.java
│ │ Info.java
│ │
│ └───util
│ MyValidationDelegate.java
│
├───resources
└───webapp
│ Edit.html
│ index.jsp
│ Info.html
│
└───WEB-INF
app.application
web.xml
Используется плагин Smart Tomcat в IntelliJ IDEA Community Edition. Пробовал и просто WAR собрать и разместить на Tomcat автономно. Перепробовал разные версии Tomcat с 9.0.85 и вниз до 6.0.30, везде ошибка одна и та же. Запускаться то запускается, показывает стартовый index.jsp, но при попытке обратиться к сервлету app падает с 500-й ошибкой.
...
org.apache.hivemind.ApplicationRuntimeException: Unable to add method java.lang.String getPreloadedImageReference(org.apache.tapestry.IComponent, java.lang.String) to class $ResponseBuilder_18d419d3852: java.io.IOException: invalid constant type: 15
location: jar:file:/C:/Users/UserName/.m2/repository/org/apache/tapestry/tapestry-framework/4.1.6/tapestry-framework-4.1.6.jar!/META-INF/tapestry.globals.xml, line 143, column 73
org.apache.hivemind.ApplicationRuntimeException: Unable to add method java.lang.String getPreloadedImageReference(org.apache.tapestry.IComponent, java.lang.String) to class $ResponseBuilder_18d419d3852: java.io.IOException: invalid constant type: 15
org.apache.hivemind.ApplicationRuntimeException: Unable to add method java.lang.String getPreloadedImageReference(org.apache.tapestry.IComponent, java.lang.String) to class $ResponseBuilder_18d419d3852: java.io.IOException: invalid constant type: 15
java.lang.RuntimeException: java.io.IOException: invalid constant type: 15
...
В логе Tomcat Localhost Log при запуске это:
25-Jan-2024 22:44:25.973 SEVERE [main] org.apache.catalina.core.StandardContext.loadOnStartup Servlet [app] in web application [/task-tapestry] threw load() exception
java.io.IOException: invalid constant type: 15
at javassist.bytecode.ConstPool.readOne(ConstPool.java:1023)
at javassist.bytecode.ConstPool.read(ConstPool.java:966)
at javassist.bytecode.ConstPool.<init>(ConstPool.java:127)
at javassist.bytecode.ClassFile.read(ClassFile.java:693)
at javassist.bytecode.ClassFile.<init>(ClassFile.java:85)
...
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ru.tapestrytest</groupId>
<artifactId>task-tapestry</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>task-tapestry Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.tapestry/tapestry-framework -->
<dependency>
<groupId>org.apache.tapestry</groupId>
<artifactId>tapestry-framework</artifactId>
<version>4.1.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.tapestry/tapestry-annotations -->
<dependency>
<groupId>org.apache.tapestry</groupId>
<artifactId>tapestry-annotations</artifactId>
<version>4.1.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.tapestry/tapestry-contrib -->
<dependency>
<groupId>org.apache.tapestry</groupId>
<artifactId>tapestry-contrib</artifactId>
<version>4.1.6</version>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.25.0-GA</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>task-tapestry</finalName>
</build>
</project>
web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Tapestry 4 TestProject</display-name>
<context-param>
<!-- tell Tapestry where to look for pages, components and mixins -->
<param-name>tapestry.app-package</param-name>
<param-value>ru.tapestrytest</param-value>
</context-param>
<servlet>
<servlet-name>app</servlet-name>
<servlet-class>org.apache.tapestry.ApplicationServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/app</url-pattern>
</servlet-mapping>
</web-app>
app.application
<?xml version="1.0"?>
<!DOCTYPE application PUBLIC
"-//Apache Software Foundation//Tapestry Specification 4.0//EN"
"http://tapestry.apache.org/dtd/Tapestry_4_0.dtd">
<application name="app">
<meta key="org.apache.tapestry.page-class-packages" value="ru.tapestrytest.pages"/>
</application>
Вопрос: я где-то что-то не прописал, не указал зависимости какие-то, или указал не тех версий?
Ответы (1 шт):
Отвечу. Чтобы всё это заработало была изменена версия Java в проекте на 1.7, а так же были изменены файлы pom.xml (изменена версия javax.servlet-api на 3.0.1 и убрана зависимость javassist):
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ru.tapestrytest</groupId>
<artifactId>task-tapestry</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>task-tapestry Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<maven.compiler.source>7</maven.compiler.source>
<maven.compiler.target>7</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.tapestry/tapestry-framework -->
<dependency>
<groupId>org.apache.tapestry</groupId>
<artifactId>tapestry-framework</artifactId>
<version>4.1.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.tapestry/tapestry-annotations -->
<dependency>
<groupId>org.apache.tapestry</groupId>
<artifactId>tapestry-annotations</artifactId>
<version>4.1.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.tapestry/tapestry-contrib -->
<dependency>
<groupId>org.apache.tapestry</groupId>
<artifactId>tapestry-contrib</artifactId>
<version>4.1.6</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>task-tapestry</finalName>
</build>
</project>
и добавлена строчка в app.application, чтобы не было ошибки домашней страницы:
<?xml version="1.0"?>
<!DOCTYPE application PUBLIC
"-//Apache Software Foundation//Tapestry Specification 4.0//EN"
"http://tapestry.apache.org/dtd/Tapestry_4_0.dtd">
<application name="app">
<meta key="org.apache.tapestry.page-class-packages" value="ru.tapestrytest.pages"/>
<meta key="org.apache.tapestry.home-page" value="Info"/>
</application>
Запущено все это на Tomcat 6.0.30.
P.S.: спасибо @NowhereMan за подсказку!