在从JBoss 5迁移到7.1.1的过程中,我遇到了多个问题。其中之一是Tapestry根本无法工作。
此错误的唯一“有用”标志是,当我尝试访问我的Web应用程序(EAR中捆绑的WAR)并在浏览器中显示“未找到”时,服务器会响应404。
即使将每个LOG4J输出转换为DEBUG,服务器日志也根本没有提供有用的信息。
我尝试升级不同的依赖项,更改战争结构以符合Tapestry规范等。
我注意到我的应用程序相应地使用ClasspathURLConverter
来访问https://wiki.apache.org/tapestry/HowToRunTapestry5OnJBoss5
但是,转换器在JBoss 7上无法正常工作
答案 0 :(得分:0)
这个问题的解决方案的确是在Tapestry查找页面,组件等时对URL进行错误的URL转换。(我不得不深入研究Tapestry的源代码,并对其进行彻底调试)。
因此,我试图更深入地研究VFS系统和URL转换。我发现5个以上具有相同代码的链接供转换器使用(例如http://www.voidcn.com/article/p-mpuwwlxm-eh.html)。此实现的问题是我的JAR是否直接位于{myEar}/lib/
文件夹中。我修改了代码,但导致路径指向文件系统中爆炸但空的jar。
然后我在这里找到了另一种解决方案:https://developer.jboss.org/thread/172599 -更简单,更有效。
这是最终的解决方案:
AppModule.java:
public static void contributeServiceOverride(MappedConfiguration<Class, Object> configuration) {
configuration.add(ClasspathURLConverter.class, new MyClasspathURLConverterImpl());
}
MyClasspathURLConverterImpl.java:
public URL convert(URL url) {
if (url != null && url.getProtocol().startsWith("vfs")) {
try {
return getRealFilePath(url.getPath());
} catch (Exception e) {
log.error(e.getCause());
}
}
return url;
}
private URL getRealFilePath(String urlString) throws IOException {
VirtualFile vFile = VFS.getChild(urlString);
URL physicalUrl = VFSUtils.getPhysicalURI(vFile).toURL();
String physicalUrlStr = physicalUrl.toString();
if (physicalUrlStr.contains(".jar")) {
int jarIdx = physicalUrlStr.indexOf(".jar");
String part1 = physicalUrlStr.substring(0, jarIdx + 4);
String part2 = physicalUrlStr.substring(jarIdx + 4);
String jarName = part1.substring(part1.lastIndexOf("/") + 1, jarIdx + 4);
String dir = part1 + part2.substring(0, part2.indexOf("/"));
String jarLocation = dir + "/" + jarName;
String packageName = part2.substring(part2.indexOf("/"));
if (packageName.startsWith("/contents")) {
packageName = packageName.substring(9);
}
String result = "jar:" + jarLocation + "!" + packageName;
physicalUrl = new URL(result);
}
return physicalUrl;
}
pom.xml
<dependency>
<groupId>org.jboss</groupId>
<artifactId>jboss-vfs</artifactId>
<version>3.2.14.Final</version>
<scope>provided</scope>
</dependency>