繁体   English   中英

您如何使用maven将GWT应用程序打包到胖JAR中?

[英]How do you package a GWT application in a fat JAR using maven?

我的GWT应用程序当前已使用maven打包到war中,然后将其部署到tomcat。 我想更改为用jar打包,以便可以用java -jar执行,并从Jetty之类的嵌入式Web服务器提供应用程序。 与在开发人员模式下运行时发生的情况类似,但我希望它发生在包含HTML和GWT js文件的单个易于部署的fat / uber jar中。 我只能找到在Spring上为Jetty进行此操作的说明,而无法使其适用于GWT。 Jetty的示例uber jar项目之类的项目已经结束,也需要与GWT一起使用。

您只需更改Maven项目的包装即可:

<project>
    ...
    <packaging>jar</packaging>
    ...
</project>

请注意,您无法在tomcat中部署jar文件

接下来,我将确保提供的依赖项gwt-dev提供了作用域(因为该依赖项已经包含了旧版本的jetty)。 之后,您可以添加jersey依赖项并启动为您的GWT应用程序提供服务的嵌入式服务器(例如, 参见此处 )。

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.project</groupId>
  <artifactId>core</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>
</project>

了解更多信息

结合示例Jetty项目和@ mam10eks的答案,我想无论如何我已经设法为一个简单的GWT应用程序解决了这个问题:

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>
<groupId>com.example.HelloJettyGwt</groupId>
<artifactId>HelloJettyGwt</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>HelloJettyGwt</name>

<properties>
    <gwtVersion>2.7.0</gwtVersion>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <jetty-version>9.3.2.v20150730</jetty-version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.google.gwt</groupId>
            <artifactId>gwt</artifactId>
            <version>${gwtVersion}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>com.google.gwt</groupId>
        <artifactId>gwt-servlet</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>com.google.gwt</groupId>
        <artifactId>gwt-user</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>com.google.gwt</groupId>
        <artifactId>gwt-dev</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-servlet</artifactId>
        <version>${jetty-version}</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jetty.websocket</groupId>
        <artifactId>javax-websocket-server-impl</artifactId>
        <version>${jetty-version}</version>
    </dependency>

</dependencies>

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>

    <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/classes</outputDirectory>

    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>gwt-maven-plugin</artifactId>
            <version>2.7.0</version>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                        <goal>test</goal>
                        <goal>generateAsync</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <runTarget>app.html</runTarget>
                <modules>
                    <module>com.example.HelloJettyGwt.app</module>
                </modules>
            </configuration>
        </plugin>

        <plugin>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.5</version>
            <executions>
                <execution>
                    <id>copy-resources</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.outputDirectory}</outputDirectory>
                        <resources>
                            <resource>
                                <directory>
                                    src/main/webapp
                                </directory>
                                <filtering>true</filtering>
                                <includes>
                                    <include>**/*.html</include>
                                    <include>**/*.css</include>
                                    <include>**/web.xml</include>
                                </includes>
                            </resource>

                            <resource>
                                <directory>
                                    ${project.build.directory}/${project.build.finalName}/
                                </directory>
                                <filtering>true</filtering>
                                <includes>
                                    <include>**/app/**</include>
                                </includes>
                            </resource>
                        </resources>
                    </configuration>
                </execution>
            </executions>
        </plugin>


        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.5</version>
            <configuration>
                <archive>
                    <manifest>
                     <mainClass>com.example.HelloJettyGwt.ServerMain</mainClass>
                    </manifest>
                    <manifestEntries>
                        <Implementation-Version>${jetty-version}</Implementation-Version>
                    </manifestEntries>
                </archive>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.3</version>
            <executions>
                <execution>
                    <id>rebuild-war</id>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <createDependencyReducedPom>false</createDependencyReducedPom>
                        <artifactSet>
                            <includes>
                                <include>*:*</include>
                            </includes>
                        </artifactSet>
                        <filters>
                            <filter>
                                <artifact>*:*</artifact>
                                <excludes>
                                    <exclude>META-INF/VERSION.txt</exclude>
                                    <exclude>META-INF/LICENSE.txt</exclude>
                                </excludes>
                            </filter>
                            <!-- exclude the MANIFEST.MF entries that will cause problems -->
                            <filter>
                                <artifact>javax.annotation:*</artifact>
                                <excludes>
                                    <exclude>META-INF/MANIFEST.MF</exclude>
                                </excludes>
                            </filter>
                            <filter>
                                <artifact>javax.servlet:*</artifact>
                                <excludes>
                                    <exclude>META-INF/MANIFEST.MF</exclude>
                                </excludes>
                            </filter>
                            <filter>
                                <artifact>javax.websocket:*</artifact>
                                <excludes>
                                    <exclude>META-INF/MANIFEST.MF</exclude>
                                </excludes>
                            </filter>
                            <filter>
                                <artifact>org.eclipse.jetty:*</artifact>
                                <excludes>
                                    <exclude>META-INF/MANIFEST.MF</exclude>
                                </excludes>
                            </filter>
                            <filter>
                                <artifact>org.eclipse.jetty.websocket:*</artifact>
                                <excludes>
                                    <exclude>META-INF/MANIFEST.MF</exclude>
                                </excludes>
                            </filter>
                            <filter>
                                <artifact>org.ow2.asm:*</artifact>
                                <excludes>
                                    <exclude>META-INF/MANIFEST.MF</exclude>
                                </excludes>
                            </filter>
                        </filters>
                        <transformers>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-enforcer-plugin</artifactId>
            <version>1.1.1</version>
            <executions>
                <execution>
                    <id>enforce-java</id>
                    <goals>
                        <goal>enforce</goal>
                    </goals>
                    <configuration>
                        <rules>
                            <requireMavenVersion>
                                <version>[3.0.0,)</version>
                            </requireMavenVersion>
                            <requireJavaVersion>
                                <version>[1.8,)</version>
                                <message>[ERROR] OLD JDK [${java.version}] in use.
                                    Jetty
                                    ${jetty-version} requires JDK 1.8 or newer</message>
                            </requireJavaVersion>
                        </rules>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

主要方法:

    Server server = new Server(8080);

    URL webRootLocation = this.getClass().getResource("/app.html");
    if (webRootLocation == null)
    {
        throw new IllegalStateException("Unable to determine webroot URL location");
    }

    URI webRootUri = URI.create(webRootLocation.toURI().toASCIIString().replaceFirst("/app.html$","/"));

    WebAppContext altHandler = new WebAppContext();
    altHandler.setResourceBase(Resource.newResource(webRootUri).toString());
    altHandler.setDescriptor(Resource.newResource(webRootUri).toString() + "WEB-INF/web.xml");
    altHandler.setContextPath("/");
    altHandler.setParentLoaderPriority(true);

    server.setHandler(altHandler);

    server.start();
    server.join();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM