Gradle + Eclipse: использовать класс из существующего проекта в новом проекте - PullRequest
0 голосов
/ 30 декабря 2018

Я знаю, что есть много вопросов, которые кажутся похожими.Я также потратил несколько часов, чтобы разобраться с мультипроектами Gradle.Но я до сих пор не понимаю, какой здесь лучший курс действий.Кстати, я использую Groovy в качестве языка кодирования, но объяснения, ссылающиеся на Java, были бы столь же хороши.

Я разработал проект Eclipse Gradle, "ProjectA", который, в частности, имеет класс IndexManager, которыйотвечает за создание, открытие и запрос индексов Lucene.

Сейчас я занимаюсь разработкой нового проекта Eclipse Gradle "ProjectB", в котором хотел бы использовать класс IndexManager из ProjectA.

Это не значит, что я хотел бы, чтобы оба проекта были частью мультипроекта.Я не хочу компилировать последнюю версию ProjectA каждый раз, когда я компилирую ProjectB - вместо этого я бы хотел, чтобы ProjectB зависел от *1001* конкретной версии IndexManager ProjectA *1013*.С возможностью обновления до новой версии в будущем.То есть, как с типами зависимостей, которые вы получаете от Maven или JCenter ...

Оба проекта имеют плагин application, поэтому ProjectA создает исполняемый файл .jar, имя которого включает версию.Но в настоящее время он содержит только файлы .class, файлы ресурсов и файл с именем MANIFEST.MF, содержащий строку «Manifest-Version: 1.0».Очевидно, что он не содержит каких-либо зависимостей (например, jar-файлов Lucene), необходимых для файлов .class.

Плагин application также позволяет создавать исполняемый дистрибутив: он состоит из исполняемого файла (2на самом деле, один для * nix / Cygwin, один для Windows), но также все зависимости .jar, необходимые для его запуска.

Может кто-нибудь объяснить, как я могу выполнить задачу по упаковке этого класса, IndexManager (или, возможно, все классы в ProjectA), а затем включить его в мое предложение dependencies файла build.gradle ProjectB ... и затем использовать его в заданном файле (Groovy или Java) ProjectB?

Или укажите какой-нибудь учебник о лучшем образе действий?

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Вы должны иметь возможность обновить модель Eclipse, чтобы отразить эту зависимость от проекта к проекту.Это выглядит примерно так (в build.gradle ProjectB):

apply plugin: 'eclipse'

eclipse {
  classpath.file.whenMerged {
    entries << new org.gradle.plugins.ide.eclipse.model.ProjectDependency('/ProjectA')
  }
  project.file.whenMerged {
    // add a project reference, which should show up in /ProjectB/.project's <projects> element
  }
}

Эти изменения могут относиться к работающей модели данных, поэтому они могут фактически не изменять файлы .classpath и .project.Дополнительную информацию можно найти здесь: https://docs.gradle.org/current/dsl/org.gradle.plugins.ide.eclipse.model.EclipseModel.html

Эта проблема обсуждается здесь: http://gradle.1045684.n5.nabble.com/Gradle-s-Eclipse-DSL-and-resolving-dependencies-to-workspace-projects-td4856525.html, и ошибка была открыта, но никогда не устранялась здесь: https://issues.gradle.org/browse/GRADLE-1014

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

Один из возможных ответов на этот вопрос, который я, похоже, нашел, но нахожу немного неудовлетворительным, заключается в том, чтобы взять класс, который будет использоваться несколькими проектами, здесь IndexManager, и поместить его в проект Gradle, которыйспециально разработан для библиотеки Groovy.Для этого вы можете запустить его, создав каталог проекта, а затем:

$ gradle init --type groovy-library

... можно сделать из приглашения Cygwin, но не из Eclipse, насколько я знаю.Таким образом, вы должны импортировать его в Eclipse.Затем build.gradle в этом библиотечном проекте должен включить зависимости, необходимые для IndexManager, в этом случае:

compile 'org.apache.lucene:lucene-analyzers-common:6.+'
compile 'org.apache.lucene:lucene-queryparser:6.+'
compile 'org.apache.lucene:lucene-highlighter:6.+'
compile 'commons-io:commons-io:2.6'
compile 'org.apache.poi:poi-ooxml:4.0.0'
compile 'ch.qos.logback:logback-classic:1.2.1'

После этого я запустил gradle jar, чтобы создать .jar, содержащий этот IndexManager класс, изначально без каких-либо причудливых вещей в манифесте (например, имя, версия).И я поместил этот файл .jar в выделенный локальный каталог.

Затем я создал другой проект Gradle для использования этого файла .jar, критическая зависимость которого здесь

compile files('D:/My Documents/software projects/misc/localJars/XGradleLibExp.jar' )

Используемый файлэтот класс выглядит следующим образом:

package core
import XGradleLibExp.IndexManager

class Test {
    public static void main( args ) {
        println "hello xxx"
        Printer printer = new Printer()
        IndexManager im = new IndexManager(  printer )
        def result = im.makeIndexFromDbaseTable()
        println "call result $result"
    }
}

class Printer {
    def outPS = new PrintStream(System.out, true, 'UTF-8' )
}

... Я спроектировал IndexManager для использования вспомогательного класса, который имел свойство outPS.Groovy duck-typing означает, что вам просто нужно что-то предоставить с таким свойством, и, надеюсь, все будет работать.

Вышеуказанное соглашение не сработало: хотя вы можете выполнить build и installdist без ошибок, попыткавыполнить распределенный исполняемый файл не удалось, так как указанные выше строки зависимостей 6 compile отсутствуют в build.gradle проекта-потребителя.Когда вы помещаете их в build.gradle этого «потребительского» проекта Gradle, он работает.

Без сомнения, вы можете добавить версию в сгенерированный файл .jar и, таким образом, сохранить старые версии для использования с «потребительскими» проектами.,Я не понимаю, как вы можете использовать механизм, который делает загрузку и использование зависимостей, необходимых для .jar, настолько автоматическим, насколько мы привыкли к вещам, полученным из «реальных репозиториев».


PS В ходе моей сегодняшней борьбы я, похоже, обнаружил, что плагин Gradle "maven-publish" не совместим с Gradle 5. + (который я использую).Это может иметь или не иметь отношение: некоторые люди говорили об использовании «локального репозитория Maven».Я понятия не имею, является ли это ответом на мою проблему ... Жду ввода от über-Gradle-гика ...:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...