Buildship продолжает перезаписывать .classpath

Я использую Gradle и Eclipse с плагином Buildship.

Buildship создает файл .classpath для использования Eclipse. Мне нужно, чтобы одна запись пути к классам (com.gwtplugins.gwt.eclipse.core.GWT_CONTAINER) отображалась после записи org.eclipse.buildship.core.gradleclasspathcontainer по причинам загрузки классов.

Таким образом, соответствующая часть моего файла .classpath должна выглядеть так (с GWT_CONTAINER внизу).

<classpath>
 <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
 <classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer" />
 <classpathentry kind="con" path="com.gwtplugins.gwt.eclipse.core.GWT_CONTAINER"/>
</classpath>

Buildship всегда имеет gradleclasspathcontainer на последней позиции. Поэтому я попытался изменить сортировку следующим образом в моем build.gradle (отрывок):

eclipse {
    classpath { 
        file {
            beforeMerged { classpath ->
                def gwtClasspath = classpath.entries.find { entry -> entry.path == 'com.gwtplugins.gwt.eclipse.core.GWT_CONTAINER' }
                classpath.entries.remove gwtClasspath
                classpath.entries << gwtClasspath
            }
        }
    }

При использовании ./gradlew eclipseClasspath файл .classpath создается правильно. Но как только Buildship запускается, файл снова перезаписывается с неправильным порядком.

Я также пытался использовать whenMerged вместо beforeMerged, но это ничего не меняет.

Вот вывод Gradle при запуске Buildship (например, при нажатии Gradle -> Refresh в свойствах проекта Eclipse):

Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0.
See https://docs.gradle.org/4.5/userguide/command_line_interface.html#sec:command_line_warnings

CONFIGURE SUCCESSFUL in 0s
:cleanEclipseWtpComponent
:cleanEclipseWtpFacet
:cleanEclipseWtp
:eclipseWtpComponent
:eclipseWtpFacet
:eclipseWtp

Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0.
See https://docs.gradle.org/4.5/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 0s
4 actionable tasks: 4 executed

Кажется, Buildship даже не выполняет задачу eclipseClasspath, а создает файл .classpath каким-то другим способом.

Как я могу заставить Buildship выполнить мое желание, чтобы путь к классам был отсортирован по моему пути?


person Bob    schedule 02.03.2018    source источник
comment
Подойдет ли вам GWT Gradle Plugin?   -  person howlger    schedule 02.03.2018
comment
Я уже использую это (отсюда и запись classpath для GWT).   -  person Bob    schedule 02.03.2018


Ответы (2)


Я нашел решение на Gradle форумы:

Buildship не использует задачу eclipseClasspath, а считывает конфигурацию и создает .classpath своими силами. Путь к классам Gradle добавляется в конец пути к классам, если он еще не определен. Это происходит после выполнения секции whenMerged. Таким образом, решение состоит в том, чтобы добавить путь к классам Gradle вручную:

eclipse {
   classpath {
        containers 'org.eclipse.buildship.core.gradleclasspathcontainer'
   }
}
person Bob    schedule 19.03.2018

Возможно, хук withXml работал бы по-другому.

eclipse.classpath.file {
    withXml { provider ->
        def entry = provider.asNode().classpath.classpathentry.find { it.path == 'com.gwtplugins.gwt.eclipse.core.GWT_CONTAINER' }
        println "Found $entry"
        def parent = entry.parent()
        parent.remove(entry)
        parent.append(entry)
    }
}
person lance-java    schedule 02.03.2018
comment
Спасибо за предложение, но это не меняет результат :( - person Bob; 02.03.2018
comment
Что выводил println? - person lance-java; 02.03.2018
comment
Я только что заметил, что Buildship не выполняет задачу eclipseClasspath. Таким образом, эта задача не дает результатов, но файл .classpath все еще существует после запуска Buildship. Так что проблема, вероятно, в том, что Buildship использует другие средства для создания этого файла. Buildship выполняет следующие задачи: eclipseWtpComponent, eclipseWtpFacet и eclipseWtp. Если я удалю .classpath и запущу Gradle вручную с этими задачами, он не создаст новый файл .classpath. - person Bob; 03.03.2018
comment
Buildship должен запускать задачу eclipseClasspath каждый раз, когда вы щелкаете правой кнопкой мыши по проекту и выбираете «Обновить проект gradle» (также есть кнопка «Обновить» в представлении сборки). Как GWT_CONTAINER попал в твой .classpath? Вы его вручную добавляли? Любые дополнения следует делать через build.gradle, а не вручную - person lance-java; 03.03.2018
comment
Я использую плагин GWT (ссылка в первом комментарии под вопросом). Судя по журналу, Buildship не использует задачу eclipseClasspath. - person Bob; 03.03.2018
comment
Вы правы, он не использует задачу eclipseClasspath, но использует модель eclipse.classpath из build.gradle. Если вы не добавляете GWT_CONTAINER в build.gradle, то я уверен, что это ваша проблема. Все должно быть в build.gradle, и ничего не может быть добавлено в .classpath другим внешним процессом/плагином (это нормально, что плагин GWT читает запись GWT_CONTAINER и действует соответственно). Возможно, вам также нужно добавить природу GWT в build.gradle? - person lance-java; 03.03.2018
comment
Согласно документации GWT Gradle Plugin, он автоматически добавляет природу GWT. И путь к классам включает GWT_CONTAINER, но только в неправильном месте. - person Bob; 04.03.2018
comment
Хорошо, если это добавление градиента, тогда все в порядке. Итак, выполняется ли println в закрытии withXml, когда вы обновляете проект gradle в eclipse? Находит ли он запись GWT? - person lance-java; 05.03.2018
comment
Нет, он даже не выполняет задачу eclipseClasspath, поэтому часть withXml тоже не выполняется. Я добавлю некоторую информацию журнала к вопросу. - person Bob; 06.03.2018
comment
Согласен, но все же следует использовать модель затмения, включающую withXml - person lance-java; 06.03.2018
comment
То же самое касается beforeMerged или whenMerged, но это не так. - person Bob; 06.03.2018