Решением этой проблемы действительно был плохой перевод 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>