Как запустить несколько веб-приложений на пристани в затмении - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь настроить среду разработки для простого приложения для нескольких веб-приложений в eclipse.Приложение развернуто в производстве на пристани, и это то, что я хотел бы использовать при разработке.У меня проблемы с запуском затмения для запуска всех веб-приложений и возможности отладки.

Решения, которые мне удалось найти в сети, используют плагины, которые могут запускать только отдельные веб-приложения.Или они запускают веб-приложения через gradle (gretty) на сервере, что затем вызывает проблемы с отладкой.

Мой источник - многопроектное приложение gradle.Он компилируется правильно, есть докерские скрипты, которые могут запускать программное обеспечение.В затмении все компилируется без ошибок и, кажется, работает нормально.Я в растерянности, однако, как на самом деле запустить / отладить все веб-приложения в то же время в пристани в затмении.Что-то, что я могу сделать с tomcat и websphere.

Может кто-нибудь из вас, любезно посмотрит, предложит мне метод, позволяющий мне отладить эту настройку в Eclipse?В идеале что-то, что я могу настроить из Gradle.Должен ли я создать проект, который запускает встроенный сервер?(Может ли это автоматически обнаруживать и использовать мои существующие файлы web.xml?) Или мне следует продолжить работу с gretty (можно ли отладить с помощью eclipse простым способом) Или я пропускаю какой-то другой инструмент?

Iне может быть единственным с этой настройкой.Какое общее решение для этого?

1 Ответ

0 голосов
/ 19 июля 2019

В интернете очень мало информации, которая конкретно касается этой проблемы. Поэтому я найду время, чтобы ответить на свой вопрос в надежде, что это поможет кому-то еще.

Гретти не может с этим справиться, Гретти делает серьезные предположения о вашем приложении, если вы создали его с самого начала, чтобы придерживаться тех предположений, что у вас все хорошо, и это может быть отличной помощью. Но решение остается медленным и негибким.

Не существует плагинов Eclipse для Jetty, хотя Jetty - это проект затмения (фундамента), wtp вам не поможет ..

Я, в конце концов, выбрал встроенный причал Это казалось сложнее, чем было на самом деле. Но конечный результат работает как шарм. Чрезвычайно быстрое время запуска (наш проект 12 веб-приложений пошел с 30+ секунд до 5 секунд) (Гретти занял минуты) Все приложение стало более понятным. Существует один простой класс Java, который определяет, что работает. Нет трудно читать XML.

Вот базовая структура

this.server = new Server(port);

setupAnnotationScanning(server);
setupJAASLoginService(server, config);

HandlerCollection hc = new HandlerCollection(true);
startWebApp(config, hc, "/app1", "app1");

// Root must be defined last or it will interfere with non root webapps
startWebApp(config, hc, "/", "rootapp");

server.setHandler(hc);

Аннотированное сканирование - это хорошо, я хочу его.

private static void setupAnnotationScanning(Server server) {
    Configuration.ClassList classlist = Configuration.ClassList.setServerDefault(server);
    classlist.addAfter("org.eclipse.jetty.webapp.FragmentConfiguration", "org.eclipse.jetty.plus.webapp.EnvConfiguration", "org.eclipse.jetty.plus.webapp.PlusConfiguration");
    classlist.addBefore("org.eclipse.jetty.webapp.JettyWebXmlConfiguration", "org.eclipse.jetty.annotations.AnnotationConfiguration");
}

Службу входа в систему JAAS было сложнее настроить, она предполагала наличие файла конфигурации на диске, у меня не было этого корня, и я все равно хотел получить его из моей собственной службы свойств начальной загрузки.

private static void setupJAASLoginService(Server server, BootstrapProperties config) throws Exception {
    JAASLoginService loginService = new JAASLoginService("ldaploginmodule");
    loginService.setName("WebRealm");
    loginService.setConfiguration(setupLDAPConfiguration(config));
    loginService.start();

    server.addBean(loginService);
}

private static javax.security.auth.login.Configuration setupLDAPConfiguration(BootstrapProperties config) {
  // Basically what I do here is make my own implementation of the Configuration and use it
  // The existing class assumes code to be in a very specific file location.
    return new javax.security.auth.login.Configuration() {
        @Override
        public AppConfigurationEntry[] getAppConfigurationEntry(String name) {
            Map<String, Object> options = new HashMap<String, Object>();

            options.put("authenticationMethod", "simple");
            options.put("bindDn", config.get("ldap.bind.user"));
            options.put("bindPassword", config.get("ldap.bind.password"));
            options.put("contextFactory", "com.sun.jndi.ldap.LdapCtxFactory");
            options.put("debug", "true");
            options.put("forceBindingLogin", "true");
            options.put("hostname", config.get("ldap.host"));
            options.put("port", config.get("ldap.port"));
            options.put("roleBaseDn", config.get("ldap.groups.dn") + "," + config.get("ldap.root.dn"));/**/
            options.put("roleMemberAttribute", "uniqueMember");
            options.put("roleNameAttribute", "cn");
            options.put("roleObjectClass", "groupOfUniqueNames");
            options.put("userBaseDn", config.get("ldap.people.dn") + "," + config.get("ldap.root.dn"));/**/
            options.put("userIdAttribute", "uid");
            options.put("userObjectClass", "caUser");
            options.put("userPasswordAttribute", "userPassword");
            options.put("userRdnAttribute", "cn");

            AppConfigurationEntry cfg = new AppConfigurationEntry("org.eclipse.jetty.jaas.spi.LdapLoginModule", LoginModuleControlFlag.REQUIRED, options);
            return new AppConfigurationEntry[] { cfg };
        }
    };
}

Возможно, вам придется изменить параметры, чтобы они соответствовали вашему собственному ldap. Если вы сравните вышеупомянутые параметры с файлом, они в значительной степени сопоставляются один на один.

Теперь для настройки веб-приложения:

Обратите внимание, что я запускаю этот класс из папки, которая является корнем моей многопроектной папки, веб-приложения находятся в подпапках ниже этого корня.

Также обратите внимание, что имя приложения должно ссылаться на имя папки. Имена приложений и папки, в которых они находятся, совпадают в этой настройке.

private static void startWebApp(BootstrapProperties config, HandlerCollection hc, String contextRoot, String appName) throws Exception {
    boolean isProd = config.getBoolean("isProduction", false);

  // When running a production server you're probably working from warfiles.
  // In dev you're working from eclipse webapp folders (WebContent/webapp/the place where your index.html resides)
    String pathStr = isProd
            ? "dist/webapps/" + appName + ".war"
            : "webapps/" + appName;

    WebAppContext context = new WebAppContext();
    // This is where you can find the webapp on your server http://example.com{/contextRoot}
    context.setContextPath(contextRoot);
    // Optional, but I found it very useful for debugging
    context.addLifeCycleListener(LIFE_CYCLE_LISTENER);

    // Very important if you want JSTL to work, otherwise you get the error:
    // The absolute uri: [http://java.sun.com/jsp/jstl/core] cannot be resolved in
    // either web.xml or the jar files deployed with this application
    // This was very hard to figure out!
    context.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern", ".*/[^/]*jstl.*\\.jar$");

    if (isProd) {
        // Again production server refers to warfile, simple basic function for jetty.
        context.setWar(pathStr);

    } else {
        // Otherwise things get a little more complicated
        // For me the app and classes folders are in two separate places.
        // But fortunately Jetty still supports that.
        Path path = Paths.get(pathStr);
        Path basePath = path.toRealPath();

        // These are folders in your eclipse projects 
        Path appFolder = basePath.resolve("webapp"); // WebContent also often used
        Path classesPath = basePath.resolve("bin/main"); 

        if (Files.exists(appFolder)) {
            context.setBaseResource(new PathResource(appFolder));
            LOGGER.log(Level.FINE, " webapp " + appFolder);
        }
        if (Files.exists(classesPath)) {
            context.setExtraClasspath(classesPath.toString());
            LOGGER.log(Level.FINE, " classes " + classesPath);
        }

        // A pure webapp project without classes works fine classesPath wont exist and is thus not added.
    }

    // Add to the handler context.
    hc.addHandler(context);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...