Как импортировать доменные классы из jar в проект Micronaut? - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть проект Micronaut, настроенный на использование GORM и Groovy (1).Этот проект содержит множество классов доменов, которые работают отлично, сохраняя данные в базе данных MySQL, как и ожидалось.

Теперь я хочу сделать эти классы доменов общими для другого проекта Micronaut (2).

Я попытался создать файл JAR, содержащий только пакет домена, и включить его в проект от 2 до build.gradle.Классы скомпилированы и сделаны доступными в коде, и я могу вызывать методы GORM, такие как findBy, createCriteria и т. Д. Также полезно упомянуть, что все классы домена проекта 2 снабжены @Entity. * 1009.*

Но когда я запускаю проект (используя IntelliJ) и нажимаю часть этого кода, я получаю:

Either class [com.project2.domain.Foo] is not a 
domain class or GORM has not been initialized correctly or has already 
been shutdown. Ensure GORM is loaded and configured correctly before 
calling any methods on a GORM entity.

Я знаю, что GORM хорошо настроен и инициализирован, потому что я создал «локальный» доменкласс внутри проекта 2 и все работало нормально.

Перед тем, как задавать этот вопрос, я увидел этот вопрос, и, возможно, он может принести некоторое вдохновение: Импорт классов домена из автономного модуля GORM в Grails

РЕДАКТИРОВАТЬ 1: Текущие build.gradle зависимости:

dependencies {
    compile "io.micronaut.configuration:micronaut-kafka"
    compile "io.micronaut.configuration:micronaut-hibernate-validator"

    compile("io.micronaut.configuration:micronaut-hibernate-gorm") {
        exclude group: 'org.grails', module: 'grails-datastore-gorm-hibernate5'
    }
    compile "org.grails:grails-datastore-gorm-hibernate5:6.1.9.RELEASE"

    compile "io.micronaut:micronaut-http-client"
    compile "io.micronaut:micronaut-http-server-netty"
    compile "io.micronaut:micronaut-runtime-groovy"
    compile "io.micronaut:micronaut-validation"
    compileOnly "io.micronaut:micronaut-inject-groovy"
    runtime "ch.qos.logback:logback-classic:1.2.3"

    runtime "org.apache.tomcat:tomcat-jdbc"

    runtime "mysql:mysql-connector-java:6.0.6"

    testCompile "io.micronaut:micronaut-inject-groovy"

    testCompile("org.spockframework:spock-core") {
        exclude group: "org.codehaus.groovy", module: "groovy-all"
    }

    compile files('src/main/resources/libs/my-domain-lib.jar')
}

Заранее спасибо!

1 Ответ

0 голосов
/ 05 декабря 2018

Я использую аналогичную настройку.

У меня есть core-lib с GORM-standalone и пара (Vert.x) версий и приложений Grails, использующих их через директивы compile project() или compile dep:from-artifactory:0.1-SNAPSHOT gradle.

Длячтобы сделать это возможным, мне нужно было:

1) убедиться, что каждый класс домена помечен grails.gorm.annotation.Entity

2) Tweak Grails 'Application.groovy, например:

class Application extends GrailsAutoConfiguration {

  @Override
  protected boolean limitScanningToApplication() {
    false
  }

  @Override
  Collection<String> packageNames() {
    super.packageNames() + 'your.domainclass.package'
  }

}

3) Для проектов без Grails мне нужно было самостоятельно найти и инициализировать классы домена, и для каждой БД он может быть разным (у меня для Mongo-GORM)

ClassPathScanningCandidateComponentProvider compProvider = new ClassPathScanningCandidateComponentProvider( false )
compProvider.addIncludeFilter new AnnotationTypeFilter( Entity )
def domainClasses = compProvider.findCandidateComponents( 'io.my.domain' ).collect{ BeanDefinition bd -> Class.forName bd.beanClassName }
new MongoDatastore( config, *domainClasses )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...