Выполнение Гобелена 5.3.8 на JBoss 7.1.1 - PullRequest
0 голосов
/ 12 февраля 2019

Я столкнулся с несколькими проблемами во время миграции с JBoss 5 до 7.1.1.Одним из них является Tapestry, который вообще не работает.

Единственный «полезный» признак этой ошибки - то, что сервер отвечает 404, когда я пытаюсь получить доступ к своему веб-приложению (WAR-пакет в EAR) и отображает «Not Found»"в браузере.

Даже после включения каждого вывода LOG4J в DEBUG журналы сервера вообще не предоставляли никакой полезной информации.

Я пытался обновить различные зависимости, изменив структуру войны в соответствии со спецификациями Tapestry.и т. д. и т. д.

Я заметил, что мое приложение использовало ClasspathURLConverter в соответствии с указанным здесь: https://wiki.apache.org/tapestry/HowToRunTapestry5OnJBoss5

Однако конвертер не работает должным образом на JBoss 7

1 Ответ

0 голосов
/ 12 февраля 2019

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