如何使用 tycho 构建和部署 e4 RAP 应用程序的 war 文件

How to build and deploy war file of e4 RAP application with tycho

我有一个 e4 RCP 产品,我想为其提供一个 e4 RAP 应用程序。因此,我添加了一个新的 OSGi 包,它提供了 org.eclipse.rap.rwt.application.ApplicationConfiguration 接口的以下实现,该接口在 OSGI-INF 文件夹中的 contribution.xml 中声明:

public class BasicApplication implements ApplicationConfiguration {

    public void configure(Application application) {
        Map<String, String> properties = new HashMap<String, String>();
        properties.put(WebClient.PAGE_TITLE, "My RAP Application");
        Bundle bundle = FrameworkUtil.getBundle(my.package.E4LifeCycle.class);
        String symbolicName = bundle.getSymbolicName();
        String appXmiLocation = "platform:/plugin/" + symbolicName + "/Application.e4xmi";
        String lifeCycleLocation = "bundleclass://" + symbolicName + "/" + my.package.E4LifeCycle.class.getName();
        E4ApplicationConfig applicationConfig = E4ApplicationConfig.create(appXmiLocation, lifeCycleLocation);
        E4EntryPointFactory entryPointFactory = new E4EntryPointFactory(applicationConfig);
        application.addEntryPoint("/myapp", entryPointFactory, properties);
        application.setOperationMode(OperationMode.SWT_COMPATIBILITY);
    }

}

按照示例 here,我创建了一个新的功能包,包括所需的插件,并取决于所有必需的 eclipse-related plugins/features(e4、rap、rwt、osgi、. ..).它包含此 pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <artifactId>my.app.rap.feature</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>eclipse-feature</packaging>

    <parent>
        <groupId>my.app</groupId>
        <artifactId>my.app.parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../../releng/my.app.parent</relativePath>
    </parent>

    <properties>
        <output.directory>${basedir}/target/WEB-INF</output.directory>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.eclipse.tycho</groupId>
                <artifactId>tycho-packaging-plugin</artifactId>
                <version>${tycho.version}</version>
                <configuration>
                    <deployableFeature>true</deployableFeature>
                </configuration>
            </plugin>

            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.0.1</version>
                <executions>
                    <execution>
                        <id>copy-web-inf</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${output.directory}</outputDirectory>
                            <resources>
                                <resource>
                                    <directory>${basedir}/templates/WEB-INF</directory>
                                    <includes>
                                        <include>**</include>
                                    </includes>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                    <execution>
                        <id>copy-plugins</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${output.directory}/eclipse</outputDirectory>
                            <resources>
                                <resource>
                                    <directory>${basedir}/target/site</directory>
                                    <includes>
                                        <include>*/**</include>
                                    </includes>
                                    <excludes>
                                        <exclude>*.jar</exclude>
                                    </excludes>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <descriptors>
                        <descriptor>assembly.xml</descriptor>
                    </descriptors>
                    <finalName>my-app</finalName>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>verify</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

引用的 assembly.xml 看起来像这样:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
    <id>rap</id>
    <formats>
        <format>war</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <fileSets>
        <fileSet>
            <directory>${output.directory}</directory>
            <outputDirectory>/WEB-INF</outputDirectory>
        </fileSet>
    </fileSets>
</assembly>

为了完整起见,这里是 parent 的 pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>my.app</groupId>
    <artifactId>my.app.parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <tycho.version>0.25.0</tycho.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.eclipse.tycho</groupId>
                <artifactId>tycho-compiler-plugin</artifactId>
                <version>${tycho.version}</version>
                <configuration>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </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>tycho-versions-plugin</artifactId>
                <version>${tycho.version}</version>
            </plugin>
        </plugins>
    </build>


    <repositories>

        <repository>
            <id>eclipse-RAP</id>
            <url>http://download.eclipse.org/rt/rap/3.1</url>
            <layout>p2</layout>
        </repository>

        <repository>
            <id>eclipse-RAP-e4</id>
            <url>http://download.eclipse.org/rt/rap/incubator/nightly/e4/target/site</url>
            <layout>p2</layout>
        </repository>

        <repository>
            <id>neon-orbit</id>
            <url>http://download.eclipse.org/tools/orbit/downloads/drops/R20160520211859/repository/</url>
            <layout>p2</layout>
        </repository>

    </repositories>

</project>

在 templates/WEB-INF 中,我放置了 web.xml 和 WAR products 工具生成的 launch.ini。 web.xml 看起来像:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app id="WebApp">
  <servlet id="bridge">  
    <servlet-name>equinoxbridgeservlet</servlet-name>
    <display-name>Equinox Bridge Servlet</display-name>
    <description>Equinox Bridge Servlet</description>
    <servlet-class>org.eclipse.equinox.servletbridge.BridgeServlet</servlet-class>

    <!-- Framework Controls could be useful for testing purpose, but
         we disable it per default -->
    <init-param>
      <param-name>enableFrameworkControls</param-name>
      <param-value>false</param-value>      
    </init-param>

    <!-- Enable multi-language support for the extension registry -->
    <!-- the OSGi console is useful for trouble shooting but will fill up your 
         appserver log quickly, so deactivate on production use. Uncomment
         the -console parameter to enabled OSGi console access.  -->
    <init-param>
      <param-name>commandline</param-name>
      <param-value>-registryMultiLanguage <!-- -console --></param-value>     
    </init-param>

    <load-on-startup>1</load-on-startup>    
  </servlet>

  <servlet-mapping>
    <servlet-name>equinoxbridgeservlet</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

</web-app>

而 launch.ini 如下:

# Eclipse Runtime Configuration Overrides
# These properties are loaded prior to starting the framework and can also be used to override System Properties
# @null is a special value used to override and clear the framework's copy of a System Property prior to starting the framework
# "*" can be used together with @null to clear System Properties that match a prefix name. 

osgi.*=@null
org.osgi.*=@null
eclipse.*=@null

osgi.parentClassloader=app
osgi.contextClassLoaderParent=app

构建成功,生成war文件。我将它放在 Tomcat 的 webapps 目录中,它会自动解压缩。但是,当我将浏览器指向 http://localhost:8080/my-app-rap 时,我只得到一个 404。所以我假设某处缺少一些关于使用哪个起点的配置。你能帮我解决这个问题吗?

尝试更改您要访问的地址: http://localhost:8080/<.war 文件.>//myapp