我目前正在尝试按照文档在Java SE中使用DeltaSpike,并制作了一个简单的界面进行测试,但我似乎做错了。

根据此处的文档,我应该能够进行基于接口的配置:
https://deltaspike.apache.org/documentation/configuration.html#_interface_based_configuration

@Configuration(prefix = "application.")
public interface AppConfig {

    @ConfigProperty(name = "name", evaluateVariables = false)
    String getApplicationName();
}


我已经尝试通过BeanProvider#getContextualReference@Inject使用它。

@Inject
public Commandler(final AppContext context, final BeanManager beanManager, AppConfig app) {
    this.appContext = context;
    this.beanManager = beanManager;
    logger.info("Initialization application with name {}.", app.getApplicationName());
    logger.info("Loaded all configuration and dependencies in {}.", appContext.getTimeSinceStartupFormatted());
}


Exception in thread "main" org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type AppConfig with qualifiers @Default


我还会收到警告:


不满意的依赖关系:没有bean与注入点匹配


我尝试摆弄build.gradle中的beans.xml文件和依赖项,但无济于事,与文档相比,我不确定自己在做什么错。

有人可以指出正确的方向吗?

最佳答案

我找到了解决问题的方法,实际上不是使用DeltaSpike,而是使用Weld,这是我在后台使用的方法。

这个问题和解决方案在这里有很好的记录:
https://discuss.gradle.org/t/application-plugin-run-task-should-first-consolidate-classes-and-resources-folder-or-depend-on-installapp-or-stuff-like-weld-se-wont-work/1248

如果链接消失了,我将在这里进行总结,问题是由Gradle将mainresource分开构建造成的,因此首先需要修改资源输出以将它们放在一起,如下所示:

sourceSets {
    main {
        output.resourcesDir = output.classesDirs.singleFile
    }

    test {
        output.resourcesDir = output.classesDirs.singleFile
    }
}


这只是将资源输出设置到classes目录。

现在,我们需要使用Gradle而不是IDE运行应用程序,我们添加了application插件。

plugins {
    id "application"
    id "java"
    id "io.spring.dependency-management" version "1.0.9.RELEASE"
}


现在有了application插件,您还需要指定主类。

application {
    mainClassName = "org.elypia.deltaspike.Main"
}


然后使用application插件,执行run,您应该一切顺利。

如果您使用的是Deltaspike批注,则可能需要更改beans.xml来找到all而不只是annotated,因为您可能使用的某些批注可能不是标准的CDI批注。

编辑:
我已经将测试仓库提交给了GitLab,因此任何人都可以看到它:
https://gitlab.com/SethiPandi/mini-deltaspike

07-24 13:41