为什么 Tycho 不能解决这种对 SWT 的简单依赖?

Why Tycho cannot resolve this simple dependency to SWT?

我认为已经研究了足够多的 Maven + Tycho 来为无头构建至少配置一个最小的目标环境,但我仍然无法使这个小示例工作。我有三个项目:

测试项目只有一个 pom.xml 构建两个子项目,其唯一有趣的部分是 <pluginManagement> 部分:

...
<build>
 <pluginManagement>
  <plugins>
    <plugin>
      <groupId>org.eclipse.m2e</groupId>
      <artifactId>lifecycle-mapping</artifactId>
      <version>1.0.0</version>
      <configuration>
        <lifecycleMappingMetadata>
          <pluginExecutions>
            <pluginExecution>
              <pluginExecutionFilter>
                <groupId>org.eclipse.tycho</groupId>
                <artifactId>target-platform-configuration</artifactId>
                <versionRange>[1.0.0,)</versionRange>
                <goals>
                  <goal>target-platform</goal>
                </goals>
              </pluginExecutionFilter>
              <action>
                <ignore />
              </action>
            </pluginExecution>
          </pluginExecutions>
        </lifecycleMappingMetadata>
      </configuration>
    </plugin>

    <plugin>
      <groupId>org.eclipse.tycho</groupId>
      <artifactId>tycho-maven-plugin</artifactId>
      <version>${tycho.version}</version>
      <extensions>true</extensions>
    </plugin>

    <plugin>
      <groupId>org.eclipse.tycho</groupId>
      <artifactId>target-platform-configuration</artifactId>
      <version>${tycho.version}</version>
      <configuration>
        <pomDependencies>wrapAsBundle</pomDependencies>
        <target>
          <artifact>
            <groupId>${project.groupId}</groupId>
            <artifactId>sub.target</artifactId>
            <version>0.0.1-SNAPSHOT</version>
          </artifact>
        </target>
        <environments>
          <environment>
            <os>linux</os>
            <ws>gtk</ws>
            <arch>x86</arch>
          </environment>
          <environment>
            <os>linux</os>
            <ws>gtk</ws>
            <arch>x86_64</arch>
          </environment>
          <environment>
            <os>win32</os>
            <ws>win32</ws>
            <arch>x86</arch>
          </environment>
          <environment>
            <os>win32</os>
            <ws>win32</ws>
            <arch>x86_64</arch>
          </environment>
          <environment>
            <os>macosx</os>
            <ws>cocoa</ws>
            <arch>x86_64</arch>
          </environment>
        </environments>
      </configuration>
    </plugin>
  </plugins>
 </pluginManagement>
</build>
...

冗长但非常简单(生命周期映射插件可能除外,但是它仅在 Eclipse 下构建时有影响,而我想在 Eclipse 之外构建)。 sub.target 项目有一个规范的 pom.xml 只有:

...
<build>
 <plugins>
  <plugin>
    <groupId>org.eclipse.tycho</groupId>
    <artifactId>tycho-maven-plugin</artifactId>
  </plugin>

  <plugin>
    <groupId>org.eclipse.tycho</groupId>
    <artifactId>target-platform-configuration</artifactId>
  </plugin>
 </plugins>
</build>
...

和一个简短的 sub.target。目标文件:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?pde version="3.8"?>
<target includeMode="feature" name="Test" sequenceNumber="1">
  <locations>
    <location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit">
      <repository location="https://download.eclipse.org/releases/latest/"/>
      <unit id="org.eclipse.equinox.p2.user.ui.feature.group" version="0.0.0"/>
    </location>
  </locations>
  <targetJRE path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
</target>

sub.ui 项目是一个小型插件项目,有一个愚蠢的主程序,使用 SWT class:

package foo;

import org.eclipse.swt.widgets.Label;

public class Main {
  public static void main(String[] args) {
    Label l = new Label(null, 0);
  }
}

和一个MANIFEST.MF:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Test UI
Bundle-SymbolicName: sub.ui;singleton:=true
Bundle-Version: 0.0.1.qualifier
Automatic-Module-Name: sub.ui
Bundle-RequiredExecutionEnvironment: JavaSE-11
Require-Bundle: org.eclipse.swt

现在,如果我打开控制台 mvn clear compile,Maven 在构建测试 UI 插件时失败,并显示错误:

[ERROR] Failed to execute goal org.eclipse.tycho:tycho-compiler-plugin:2.4.0:compile (default-compile) on project sub.ui: Compilation failure: Compilation failure: 
[ERROR] /.../sub.ui/src/foo/Main.java:[3] 
[ERROR]     import org.eclipse.swt.widgets.Label;
[ERROR]            ^^^^^^^^^^^
[ERROR] The import org.eclipse cannot be resolved
[ERROR] /.../sub.ui/src/foo/Main.java:[8] 
[ERROR]     Label l = new Label(null, 0);
[ERROR]     ^^^^^
[ERROR] Label cannot be resolved to a type
[ERROR] /.../sub.ui/src/foo/Main.java:[8] 
[ERROR]     Label l = new Label(null, 0);
[ERROR]                   ^^^^^
[ERROR] Label cannot be resolved to a type
[ERROR] 3 problems (3 errors)

显然构建过程没有 link 我的代码和我的 macos+cocoa 平台的 SWT 版本,但是它在 org.eclipse.equinox.[=53 的插件中列出=].奇怪的是,如果我不时从 Eclipse 启动 Maven,它 link 是正确的 SWT 库并完成构建过程。我错过了什么?我如何说服 Tycho 使用关于我的平台的信息来始终如一地 select macos+cocoa SWT jar 和 link 它到我的代码?如果您无法发现上述代码中的错误,我可以根据要求在 GitHub 上分享完整的示例项目。感谢您的耐心等待。

问题已解决。显然不再支持 x86 平台(我正在从事的项目很老)。如果我们从主 pom.xml 文件的 <pluginManagement> 部分删除所有 x86 <environment>s 并只保留 x86_64 部分,一切正常。