添加带有豆子的外部罐子(战争之外)

我正在尝试在war文件之外加载bean。目的是应该可以在不使用新war文件的情况下更改jar文件。

我的war文件包含外部jar作为提供的依赖项:

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

我将jar文件添加到域目录(domain / lib / applibs)中的applibs文件夹中,并在部署期间填写了库字段。

添加带有豆子的外部罐子(战争之外)

似乎没有从这个jar文件中加载任何bean(无法注入),但是可以使用该类。 (该类在当前的类加载器中可用)。

如果我从war文件中向类中注入了某些内容,则会出现异常 UnsatisfiedResolutionException: WELD-001334: Unsatisfied dependencies for type XXX with qualifiers

我正在使用payara 4.1.2.174,但它也不适用于payara 5。

主要问题是:是否应该在战争之外装载bean(ejb / cdi)?我在网络上找不到任何好的解决方案。

P.S .:我不能使用微服务;)

编辑: war文件不包含jar文件。 jar文件当前位于/ lib / applibs下的域中(我也测试了所有其他文件夹)

下面的命令asadmin add-library --type app C:\library.jar

library.jar仅包含一个CDI bean

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

和beans.xml文件。 (资源/ 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
]]
gzblue_zhuzh 回答:添加带有豆子的外部罐子(战争之外)

经过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文档。

 // 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>

之后,我构建了jar,并将其添加到domain/lib/applibs中。比我发动战争,一切都按预期进行!

,
  • 您可以将多个战争组合成一个耳朵并运行它。
  • 或者可以使用add-library命令。它适用于GlassFish Server,适用于Payara Micro。我相信应该有这样的功能(尽管我可以在Payara Server上找到它)。
本文链接:https://www.f2er.com/2740302.html

大家都在问