Добавить Внешнюю банку с фасолью (вне войны) - PullRequest
1 голос
/ 21 января 2020

Я пытаюсь загрузить бины вне военного файла. Цель состоит в том, чтобы можно было изменить файл jar без нового файла war.

Мой файл war включает внешний jar в качестве предоставленной зависимости:

        <dependency>
            <groupId>com.lube</groupId>
            <artifactId>foo</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <scope>provided</scope>
        </dependency>

Я добавил jar файл в папку applibs в каталоге домена (domain / lib / applibs) и заполнил поле библиотеки во время развертывания.

payara deployment

Кажется, что из этого jar-файла не загружаются bean-компоненты (внедрение невозможно), но можно использовать класс. (класс доступен в текущем загрузчике классов).

Если я внедряю что-то в класс из файла войны, я получаю следующее исключение UnsatisfiedResolutionException: WELD-001334: Unsatisfied dependencies for type XXX with qualifiers

Я использую Payara 4.1.2.174 , но он также не работает с payara 5.

Главный вопрос: можно ли загружать бины (ejb / cdi) вне войны? Я не нахожу никакого хорошего решения в сети.

PS: я не могу использовать микросервисы;)

Редактировать: Файл войны не не содержит файл jar. Файл jar в настоящее время находится в домене в каталоге / lib / applibs (я также проверил все остальные папки)

Команда, как я это сделал, была следующей asadmin add-library --type app C:\library.jar

The library.jar содержит только один CDI bean

@Model
public class CdiBean {
    public void test() {
        System.out.println("It works!");
    }
}

и файл bean. xml. (resources / META-INF - я тоже тестировал без папки META-INF)

В файле WAR есть класс запуска, который пытается загрузить Bean.

@Singleton
@Startup
@TransactionManagement(value = javax.ejb.TransactionManagementType.BEAN)
public class AppStartup {
    @PostConstruct
    public void postConstruct() {
        try {
            System.out.println(CdiBean.class);
            CDI.current().select(CdiBean.class).get().test();
        } catch (Exception e) {
            throw new IllegalStateException(e.getMessage(), e);
        }
    }
}

Вывод после развертывание войны составляет:

[2020-01-21T13:47:36.413+0100] [Payara 4.1] [INFO] [] [] [tid: _ThreadID=103 _ThreadName=admin-thread-pool::admin-listener(3)] [timeMillis: 1579610856413] [levelValue: 800] [[   class com.lube.CdiBean]]

[2020-01-21T13:47:36.474+0100] [Payara 4.1] [SEVERE] [] [javax.enterprise.system.tools.deployment.common] [tid: _ThreadID=103 _ThreadName=admin-thread-pool::admin-listener(3)] [timeMillis: 1579610856474] [levelValue: 1000] [[
  Exception while invoking class org.glassfish.ejb.startup.EjbApplication start method
javax.ejb.EJBException: javax.ejb.CreateException: Initialization failed for Singleton AppStartup
    ...
Caused by: javax.ejb.CreateException: Initialization failed for Singleton AppStartup
    at com.sun.ejb.containers.AbstractSingletonContainer.createSingletonEJB(AbstractSingletonContainer.java:553)
    at com.sun.ejb.containers.AbstractSingletonContainer.access$000(AbstractSingletonContainer.java:82)
    at com.sun.ejb.containers.AbstractSingletonContainer$SingletonContextFactory.create(AbstractSingletonContainer.java:723)
    ... 72 more
Caused by: java.lang.IllegalStateException: WELD-001334: Unsatisfied dependencies for type CdiBean with qualifiers  
    ... 74 more
Caused by: org.jboss.weld.exceptions.UnsatisfiedResolutionException: WELD-001334: Unsatisfied dependencies for type CdiBean with qualifiers  
    ... 102 more
]]

Ответы [ 2 ]

1 голос
/ 21 января 2020

После 3 дней тестирования я нашел решение - НАКОНЕЦ: D Я не нашел никакого решения, поэтому я поискал в репозитории payara github «applibs» и обнаружил следующий интересующий класс. appserver/web/weld-integration/src/main/java/org/glassfish/weld/DeploymentImpl.java

Существует метод под названием private void processBdasForAppLibs( ReadableArchive archive, DeploymentContext context ) с хорошим java do c.

 // These are application libraries that reside outside of the ear.  They are usually specified by entries
    // in the manifest.
    // to test this put a jar in domains/domain1/lib/applibs and in its manifest make sure it has something like:
    //                           Extension-Name: com.acme.extlib
    // In a war's manifest put in something like:
    //                           Extension-List: MyExtLib
    //                           MyExtLib-Extension-Name: com.acme.extlib

После того, как я обнаружил, что добавил следующий файл в файл jar:

            <plugin>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <archive>
                        <manifestEntries>
                            <Extension-Name>com.lube</Extension-Name>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>

и следующее к файлу войны

            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.2.3</version>
                <configuration>
                    <archive>
                        <manifestEntries>
                            <Extension-List>ExternalLib</Extension-List>
                            <ExternalLib-Extension-Name>com.lube</ExternalLib-Extension-Name>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>

После этого я собрал флягу и добавил ее в domain/lib/applibs. Чем я развернул войну, и все работает как положено!

0 голосов
/ 21 января 2020
  • Вы можете объединить несколько войн в одно ухо и запустить его.
  • Или можно использовать команду add-library. Он был доступен для GlassFi sh Сервер , для Payara Micro . Я считаю, что такая функциональность должна быть (хотя я мог бы найти ее для Payara Server).
...