【问题标题】:WELD-001409: Ambiguous dependencies for type StepContext with qualifiers @DefaultWELD-001409:带有限定符 @Default 的类型 StepContext 的不明确依赖项
【发布时间】:2017-10-03 04:25:47
【问题描述】:

我正在尝试从我的 Windows 命令提示符以 java SE 模式运行 this 示例。我已经构建了一个包含所有依赖项的 jar,并在我的命令提示符下运行它。

但是,不断收到this 错误。从this answer,我了解到我的运行时类路径中可能有多个 StepContext 类。

我现在用 maven-shade 插件替换了 maven-assembly 插件来构建我的 fat jar,我可以在打包 jar 时看到以下警告

[WARNING] javax.inject-1.jar, weld-se-2.2.15.Final.jar define 6 overlapping classes: 
[WARNING] - javax.inject.Inject 
[WARNING] - javax.inject.Singleton 
[WARNING] - javax.inject.Scope 
[WARNING] - javax.inject.Named 
[WARNING] - javax.inject.Provider 
[WARNING] - javax.inject.Qualifier 

我将以下依赖项更新为提供,现在我在打包时没有看到上述警告,但是在运行新生成的 jar 时仍然出现异常

<dependency>
            <groupId>javax.inject</groupId>
            <artifactId>javax.inject</artifactId>
            <version>1</version>
            <scope>provided</scope>
        </dependency>

执行 JAR 文件时的当前异常

Exception 0 :
org.jboss.weld.exceptions.DeploymentException: WELD-001409: Ambiguous dependencies for type InjectionPoint with qualifiers @Default
  at injection point [BackedAnnotatedParameter] Parameter 1 of [BackedAnnotatedMethod] @Produces @BatchProperty public org.jberet.creation.BatchBeanProducer.getStringList(InjectionPoint)
  at org.jberet.creation.BatchBeanProducer.getStringList(BatchBeanProducer.java:0)
  Possible dependencies:
  - Implicit Bean [javax.enterprise.inject.spi.InjectionPoint] with qualifiers [@Default],
  - Managed Bean [class org.jboss.weld.manager.BeanManagerImpl$InstanceInjectionPoint] with qualifiers [@Any @Default],
  - Managed Bean [class org.jboss.weld.injection.EmptyInjectionPoint] with qualifiers [@Any @Default]

        at org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:392)
        at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:294)
        at org.jboss.weld.bootstrap.Validator.validateGeneralBean(Validator.java:135)
        at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:168)
        at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:543)
        at org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:68)
        at org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:66)
        at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:60)
        at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:53)
        at java.util.concurrent.FutureTask.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
Exception 0 :
org.jboss.weld.exceptions.DeploymentException: WELD-001409: Ambiguous dependencies for type InjectionPoint with qualifiers @Default
  at injection point [BackedAnnotatedParameter] Parameter 1 of [BackedAnnotatedMethod] @Produces @BatchProperty public org.jberet.creation.BatchBeanProducer.getStringBuilder(InjectionPoint)
  at org.jberet.creation.BatchBeanProducer.getStringBuilder(BatchBeanProducer.java:0)
  Possible dependencies:
  - Implicit Bean [javax.enterprise.inject.spi.InjectionPoint] with qualifiers [@Default],
  - Managed Bean [class org.jboss.weld.manager.BeanManagerImpl$InstanceInjectionPoint] with qualifiers [@Any @Default],
  - Managed Bean [class org.jboss.weld.injection.EmptyInjectionPoint] with qualifiers [@Any @Default]

        at org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:392)
        at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:294)
        at org.jboss.weld.bootstrap.Validator.validateGeneralBean(Validator.java:135)
        at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:168)
        at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:543)
        at org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:68)
        at org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:66)
        at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:60)
        at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:53)
        at java.util.concurrent.FutureTask.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)

        at org.jboss.weld.bootstrap.ConcurrentValidator.validateBeans(ConcurrentValidator.java:76)
        at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:504)
        at org.jboss.weld.bootstrap.WeldStartup.validateBeans(WeldStartup.java:435)
        at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:90)
        at org.jboss.weld.environment.se.Weld.initialize(Weld.java:148)
        at org.jberet.se.SEArtifactFactory.<init>(SEArtifactFactory.java:29)
        at org.jberet.se.BatchSEEnvironment.getArtifactFactory(BatchSEEnvironment.java:133)
        at org.jberet.operations.JobOperatorImpl.<init>(JobOperatorImpl.java:93)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
        at java.lang.reflect.Constructor.newInstance(Unknown Source)
        at java.lang.Class.newInstance(Unknown Source)
        ... 8 more

我该如何解决这个问题?

【问题讨论】:

  • 使用 Maven Shade 插件构建我的胖 JAR 时显示以下输出 [WARNING] javax.inject-1.jar,weld-se-2.2.15.Final.jar 定义 6 个重叠类:[WARNING ] - javax.inject.Inject [警告] - javax.inject.Singleton [警告] - javax.inject.Scope [警告] - javax.inject.Named [警告] - javax.inject.Provider [警告] - javax.inject .限定符
  • 不寻常的部分是 Weld 抱怨 javax.inject SPI 类 InjectionPoint 的不明确依赖。通常我们会在某些应用程序 bean 类中看到这种类型的错误,这应该更容易调试,因为它是您自己的类。两个类(EmptyInjectionPointorg.jboss.weld.manager.BeanManagerImpl.InstanceInjectionPoint 都实现了InjectionPoint,因此存在歧义。但我不确定为什么 Weld 会与它自己的类混淆。我猜在胖 jar 生成过程中一些与 Weld 相关的配置会丢失/覆盖过程。
  • 我建议您跟进 Weld 和 CDI 专家。或者,如果您认为问题出在 JBeret 方面,请使用可重现的测试应用提交 JBeret 问题。
  • @cheng 我仅有的配置文件是 jberet.properties 和批处理 (JSL) XML

标签: java cdi weld jsr352 jberet


【解决方案1】:

在我看来,您的扁平化导致焊接实现最终出现在一个带有 beans.xml 的 jar 中,由于“所有”的 bean 发现模式(这没有版本的空 beans.xml 也是如此)。

如果您要将焊接 impl 塞入您的应用程序的一个大 jar 中,您应该至少确保它是 bean-discovery-mode="annotated"。

【讨论】:

  • 好的,让我尝试使用 bean-discovery-mode="annotated" 添加 beans.xml 并尝试运行应用程序
【解决方案2】:

终于能够使用 JBERET 实现在 Java SE 模式下运行 Java 批处理程序的可执行(胖)JAR。

This link 提到了这一点,一旦我切换到 2.4.5.Final,它就可以正常工作了。

直到最近嵌套/胖 JAR 才使用 Weld,直到它在 Weld 2.3.4 中使用 WELD-1930 修复

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    相关资源
    最近更新 更多