Импорт не может быть разрешен фрагментом тестового плагина с использованием Tycho, но работает в Eclipse

У меня есть проект плагина, для которого я пытаюсь создать тестовый плагин. Пакеты в моем проекте плагинов доступны для других плагинов в моей рабочей области, включая тестовый плагин, но когда я пытаюсь построить свои проекты с помощью tycho, тестовый плагин выдает ошибку, утверждающую, что импорт не может быть разрешен.

[ERROR] Failed to execute goal org.eclipse.tycho:tycho-compiler-plugin:0.25.0:compile (default-compile) on project REDACTED.tests: Compilation failure: Compilation failure:
[ERROR] REDACTED/PlanImportTest.java:[7]
[ERROR] import REDACTED.pluginname.Argument;
[ERROR] ^^^^^^^^^^^^
[ERROR] The import REDACTED.pluginname cannot be resolved

Я новичок в Tycho, поэтому я думаю, что, вероятно, есть проблема с макетом моего проекта, но я не могу найти решение своей проблемы в Интернете. Кто-нибудь знает, почему этот импорт работает в eclipse, но не при запуске сборки maven/tycho в командной строке? Соответствующие файлы ниже.

Манифест плагина:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: REDACTED.pluginname
Bundle-SymbolicName: REDACTED.pluginname;singleton:=true
Bundle-Version: 1.0.0.qualifier
Export-Package: REDACTED
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Eclipse-BuddyPolicy: registered
Eclipse-RegisterBuddy: REDACTED

Подключаемый модуль POM:

<project>
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>REDACTED</groupId>
        <artifactId>REDACTED</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <relativePath>REDACTED</relativePath>
    </parent>
    <groupId>REDACTED</groupId>
    <artifactId>REDACTED.pluginname</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>eclipse-plugin</packaging>
</project>

Тестовый класс

import static org.junit.Assert.*;
import org.junit.Test;
import REDACTED.pluginname.Argument;

public class PlanImportTest {

    @Test
    public void test() {
        Argument a = null;
        assertTrue(true);
    }
}

Манифест тестового проекта:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: REDACTED
Bundle-SymbolicName: REDACTED.tests
Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: REDACTED
Fragment-Host: REDACTED.pluginname;bundle-version="1.0.0.qualifier"
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Require-Bundle: org.junit;bundle-version="4.12.0"

Тестовый проект POM:

<project>
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>REDACTED</groupId>
        <artifactId>REDACTED</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <relativePath>REDACTED</relativePath>
    </parent>
    <groupId>REDACTED</groupId>
    <artifactId>REDACTED.tests</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>eclipse-test-plugin</packaging>
    <build>
        <plugins>
            <plugin>
                <groupId>org.eclipse.tycho</groupId>
                <artifactId>tycho-surefire-plugin</artifactId>
                <configuration>
                    <testClass>REDACTED.Test</testClass>
                    <dependencies>
                        <dependency>
                            <type>eclipse-plugin</type>
                            <groupId>REDACTED</groupId>
                            <artifactId>REDACTED.pluginname</artifactId>
                            <version>1.0.0-SNAPSHOT</version>
                        </dependency>
                    </dependencies>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

person Eddie Curtis    schedule 10.11.2016    source источник
comment
Не должно быть необходимости явно объявлять зависимости в тестовом проекте pom. Вместо этого ваш родительский pom должен указать оба проекта как «модули».   -  person Rüdiger Herrmann    schedule 10.11.2016
comment
Ах да, я уже делаю это, и сначала успешно загружается модуль pluginname. Я удалю этот плагин из pom, это было то, что я пробовал в дополнение к другим вещам, чтобы надеяться, что он заработает.   -  person Eddie Curtis    schedule 11.11.2016


Ответы (2)


поскольку вы используете фрагмент, дополнительная зависимость от хоста фрагмента в pom.xml не требуется.

Одна вещь, которая кажется мне неполной в вашем вопросе, - это использование загрузки классов приятеля. В случае, если классы, с которыми вы компилируете, на самом деле предоставляются партнером тестируемого пакета (а не самим пакетом), вам может потребоваться добавить дополнительное требование к партнеру(ам), см. https://eclipse.org/tycho/sitedocs/tycho-surefire/tycho-surefire-plugin/test-mojo.html#dependencies

В целях отладки вы можете использовать параметр maven CLI -X, который будет выводить пакеты, которые были рассчитаны для включения в тестовую среду выполнения. Таким образом, вы можете определить, отсутствует ли пакет.

person jsievers    schedule 10.11.2016
comment
Означает ли это, что мне также нужно добавить приятеля тестируемого плагина в список модулей, созданных реактором pom? - person Eddie Curtis; 11.11.2016
comment
Я удалил приятеля из тестируемого плагина, чтобы попытаться изолировать проблему, но я все еще получаю ту же ошибку, что и раньше. Я также удалил фрагмент из тестового плагина pom. Для mvn -X я должен искать в пути к классам? Если это так, это показывает мой проект: [DEBUG] Выходной каталог: REDACTED.tests/target/classes [DEBUG] Путь к классу: [DEBUG] REDACTED.tests/target/classes [DEBUG] REDACTED.pluginname/. [DEBUG] /home/developer/.m2/repository/.cache/tycho/org.junit-4.12.0.v201504281640.jar... - person Eddie Curtis; 11.11.2016

Оказывается, проблема заключалась в том, что мой тестируемый плагин неправильно экспортировал исходный каталог. Изменение в файле build.properties исправило это:

До:

bin.includes = META-INF/,\
               src/
output.. = bin

После:

bin.includes = META-INF/,\
               src/
source.. = src
output.. = bin

Так просто, но я добрался туда в конце концов.

person Eddie Curtis    schedule 11.11.2016