Ошибка при попытке запустить приложение Weld Se - контейнер Weld SE не может быть инициализирован - архивы бинов не найдены

Я создаю простое приложение JavaSE, используя Weld SE. Я пытаюсь запустить с Gradle Run это исключение:

:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:runmai 17, 2016 12:55:55 AM org.jboss.weld.bootstrap.WeldStartup <clinit>
INFO: WELD-000900: 2.3.4 (Final)
Exception in thread "main" java.lang.IllegalStateException: WELD-ENV-002009: Weld SE container cannot be initialized - no bean archives found
        at org.jboss.weld.environment.se.Weld.createDeployment(Weld.java:690)

        at org.jboss.weld.environment.se.Weld.initialize(Weld.java:570)
        at br.com.alexpfx.crawler.run.Main.main(Main.java:14)
 FAILED
1 result found for 'bean-discovery-mode'Finding with Options: Case Insensitive

y
bean-discovery-mode
1 found
Find






Replace in current buffer
Replace
Replace All
Gradle: runFile 0Project 0No Issuessrc\main\resources\META-INF\beans.xml10:1
CRLFUTF-8XML1 update

Я понимаю, что он не может найти файл beans.xml. Но это есть в src/main/resources/META-INF/beans.xml:

<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
bean-discovery-mode="all"
        version="1.1">


</beans>

Мой основной класс это:

package br.com.alexpfx.crawler.run;
import org.jboss.weld.environment.se.*;
import javax.enterprise.inject.*;
import javax.inject.*;
import br.com.alexpfx.crawler.*;
public class Main {

    @Inject
    private @Named("SuperMarket") Crawler crawler;


    public static void main(String[] args) {
        Weld weld = new Weld();
        WeldContainer container = weld.initialize();
        Main main = container.instance().select(Main.class).get();
        main.run();
        weld.shutdown();
    }


    public void run() {

        System.out.println (crawler);

    }
}

файл сборки gradle:

apply plugin: 'java'
apply plugin: 'application'



repositories{
    mavenCentral()
}


dependencies{
    // http://mvnrepository.com/artifact/org.jsoup/jsoup
    compile group: 'org.jsoup', name: 'jsoup', version: '1.9.1'

    // http://mvnrepository.com/artifact/org.jboss.weld.se/weld-se-core
    compile group: 'org.jboss.weld.se', name: 'weld-se-core', version: '2.3.4.Final'



}

sourceCompatibility = '1.8'
version = '1.0'
mainClassName = 'br.com.alexpfx.crawler.run.Main'

3 ответа

Решение

Проблема в том, что gradle run не создает JAR-файл для вашего приложения. Он просто компилирует классы и запускает основной класс с каталогом ресурсов на пути к классам (do gradle --info run чтобы увидеть это для себя). Сварке требуется бобовый архив, который является файлом jar, который содержит META-INF/beans.xml или файл войны, который содержит WEB-INF/classes/META-INF/beans.xml, Это не достаточно для beans.xml просто быть на пути к классам.

Чтобы обойти это, так как вы используете плагин приложения, просто сделайте gradle installDist и запустить сценарий оболочки или командный файл в build/install/myapp/bin,

Я пробовал решение, предоставленное @drenedo (извините, у меня недостаточно репутации для комментариев), следующий код отлично работает со мной:

sourceSets.main.resources {
    exclude 'META-INF/beans.xml'
}
classes {
    doLast{
        copy {
            from('src/main/resources') { include 'META-INF/beans.xml' }
            into "$buildDir/classes/java/main/"
        }
    }
}

И я немного озадачен тем, для чего предназначен следующий код. поскольку src/main/resources/META-INF/beans.xml а также $buildDir/classes/main/META-INF/beans.xml не являются каталогами, этот код может вызвать ошибку. Поэтому я просто удаляю это:

inputs.dir 'src/main/resources/META-INF/beans.xml'
outputs.dir "$buildDir/classes/main/META-INF/beans.xml"

И на решение ответил @J. Лент также отлично работает со мной.

Также вы можете попробовать этот плагин bean-discovery-problem-when-using-сварки-se-с-gradle-application-plugin:

task copyResources(type: Copy) {
    from "${projectDir}/src/main/resources"
    into "${buildDir}/classes/java/main"
}
processResources.dependsOn copyResources

Gradle 4+ использует другой выходной каталог для классов, поэтому не забывайте использовать ${buildDir}/classes/java/main вместо ${buildDir}/classes/main ,

Я решил эту проблему, добавив sourceSets.main.resources в build.gradle:

sourceSets.main.resources {
   exclude 'META-INF/beans.xml'
}
  classes {
   inputs.dir 'src/main/resources/META-INF/beans.xml'
   outputs.dir "$buildDir/classes/main/META-INF/beans.xml"
} << {
   copy {
      from('src/main/resources') { include 'META-INF/beans.xml' }
      into "$buildDir/classes/main/"
   }
}

С приведенным примером:

apply plugin: 'java'
apply plugin: 'application'



repositories{
    mavenCentral()
}


dependencies{
    // http://mvnrepository.com/artifact/org.jsoup/jsoup
    compile group: 'org.jsoup', name: 'jsoup', version: '1.9.1'

    // http://mvnrepository.com/artifact/org.jboss.weld.se/weld-se-core
    compile group: 'org.jboss.weld.se', name: 'weld-se-core', version: '2.3.4.Final'
}

sourceSets.main.resources {
   exclude 'META-INF/beans.xml'
}
  classes {
   inputs.dir 'src/main/resources/META-INF/beans.xml'
   outputs.dir "$buildDir/classes/main/META-INF/beans.xml"
} << {
   copy {
      from('src/main/resources') { include 'META-INF/beans.xml' }
      into "$buildDir/classes/main/"
   }
}

sourceCompatibility = '1.8'
version = '1.0'
mainClassName = 'br.com.alexpfx.crawler.run.Main'
Другие вопросы по тегам