如何迁移基于 Maven 的 Web 应用程序 POM 以使用 Gradle?

Posted

技术标签:

【中文标题】如何迁移基于 Maven 的 Web 应用程序 POM 以使用 Gradle?【英文标题】:How to migrate a Maven based web application POM to use Gradle? 【发布时间】:2019-03-04 14:56:52 【问题描述】:

是的,是的,我知道! SO上有数百个与Maven-to-Gradle相关的问题,但没有一个,AFAICT解决了移植一个非常简单的Maven POM以使用Gradle进行编译的固有困难(不断移动的目标[Gradle!])。

在这种特殊情况下,我们有一个应用程序,原始开发人员依赖于使用 Eclipse 的 GWT 插件,但许多其他开发人员希望使用更现代且不那么臃肿的东西,即 Gradle .所有来源都只是简单地将其删除到 "you can simply convert pom.xml in Gradle",就像 Gradle 文档中的 stated 一样,不幸的是这根本不适用于大多数实际目的

正在考虑的项目是 circuitJS1,它被移植到使用 Maven here。结果 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>com.lushprojects.circuitjs1</groupId>
    <artifactId>circuitjs</artifactId>
    <version>2.1.15</version>
    <packaging>gwt-app</packaging>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.google.gwt</groupId>
                <artifactId>gwt</artifactId>
                <version>2.8.2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

        <!-- generating dependency report is slow; disable it -->
        <dependency.locations.enabled>false</dependency.locations.enabled>
    </properties>
    <dependencies>

        <dependency>
            <groupId>com.google.gwt</groupId>
            <artifactId>gwt-user</artifactId>
        </dependency>
        <dependency>
            <groupId>com.google.gwt</groupId>
            <artifactId>gwt-dev</artifactId>
        </dependency>
    </dependencies>

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

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId> <!-- artifact with sources is easier to handle during development -->
                <version>3.0.1</version>
                <executions>
                    <execution>
                        <id>attach-sources</id>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <!-- declaring only in order to skip during site deployment -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-site-plugin</artifactId>
                <version>3.7</version>
                <executions>
                    <execution>
                        <id>deploy</id>
                        <phase>deploy</phase>
                        <configuration>
                            <skip>true</skip>
                        </configuration>
                    </execution>
                </executions>
                <configuration>
                    <skip>true</skip>
                    <siteDirectory>site</siteDirectory>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-project-info-reports-plugin</artifactId>
                <version>2.9</version>
                <configuration><!-- we don't need those reports; disabling speeds up 
                        build -->
                    <dependencyDetailsEnabled>false</dependencyDetailsEnabled>
                    <dependencyLocationsEnabled>false</dependencyLocationsEnabled>
                </configuration>
            </plugin>

            <!-- gwt compiler -->
            <plugin>
                <groupId>net.ltgt.gwt.maven</groupId>
                <artifactId>gwt-maven-plugin</artifactId>
                <version>1.0-rc-9</version>
                <extensions>true</extensions>
                <configuration>
                    <moduleName>com.lushprojects.circuitjs1.circuitjs1</moduleName>
                    <!-- this is the best setting for a laptop with 2 cores and HT -->
                    <localWorkers>0.5C</localWorkers>
                    <warName>circuitjs</warName>
                    <optimize>9</optimize>
                    <compilerArgs>
                        <compilerArg>-style</compilerArg>
                        <compilerArg>PRETTY</compilerArg>
                    </compilerArgs>
                    <codeServerPort>8888</codeServerPort>
                </configuration>
            </plugin>

            <!-- copy a few things around before packaging the website -->
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.0.2</version>
                <executions>
                    <execution>
                        <id>copy-resources</id>
                        <phase>install</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>$project.build.directory/site</outputDirectory>
                            <resources>
                                <resource>
                                    <directory>war</directory>
                                </resource>
                                <resource>
                                    <directory>$project.build.directory/$project.name-$project.version/circuitjs1</directory>
                                    <targetPath>circuitjs1</targetPath>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

克隆该存储库并简单地执行:mvn install 将为您提供一个工作(电路仿真)网站,您可以使用浏览器打开该网站,位于文件位置:file:///C:/path/to/circuitjs1/target/site/circuitjs.html

但是,使用 gradle init --type pom 转换为 Gradle,会生成一个 build.gradle,如下所示:

/* This file was generated by the Gradle 'init' task. */
plugins 
    id 'java'
    id 'maven-publish'

repositories 
    mavenLocal()
    maven 
        url = 'http://repo.maven.apache.org/maven2'
    

dependencies 
    compile 'com.google.gwt:gwt-user:2.8.2'
    compile 'com.google.gwt:gwt-dev:2.8.2'

task sourcesJar(type: Jar) 
    classifier = 'sources'
    from(sourceSets.main.allJava)


group = 'com.lushprojects.circuitjs1'
version = '2.1.15'
sourceCompatibility = '1.8'

publishing 
    publications 
        maven(MavenPublication) 
            from(components.java)
            artifact(sourcesJar)
        
    

tasks.withType(JavaCompile) 
    options.encoding = 'UTF-8'

不幸的是,将它与gradle build 一起使用,似乎并没有产生任何可以在浏览器中运行的东西。它确实会生成./build/ 目录,但其中的内容根本没有任何用处。

build
├── classes
│   └── java
│       └── main
│           └── com
├── generated
│   └── sources
│       └── annotationProcessor
│           └── java
├── libs
│   └── circuitjs-2.1.15.jar
└── tmp
    ├── compileJava
    └── jar
        └── MANIFEST.MF

我还尝试通过添加以下内容来使该文件成形:

//id 'com.gradle.build-scan' version '2.2.1'
id 'java'
id 'maven'
//id 'gwt-maven'
id 'maven-publish'
id 'war'
//id 'org.metahelicase.site-builder' version '1.1'
//id 'org.jbake.site' version '5.0.0'
//id 'gradle.site' version '0.6'
//id 'com.stehno.gradle.webpreview' version '0.3.0'

但无济于事......


如何使这个build.gradle 脚本正常工作,以生成在我的浏览器中本地运行应用程序所需的网络文件? 是否有任何最新的工具可以为您做到这一点?

【问题讨论】:

"坚持使用 Eclipse" 我没有连接到 Eclipse... 不多,只是他们使用了 GWT 插件并且还有其他可用选项。稍作修改。 您想迁移到 Gradle 的任何具体原因? 很多,仅举几例,更快,更高效,更好的文档,更好的支持,广泛的使用?但是,我认为您的问题不相关。 我只是好奇。从 Maven 迁移到 Gradle 并非易事,而且 Maven 是迄今为止最流行的构建工具,所以我真的很感兴趣你为什么选择切换。在构建速度方面,Gradle 可能具有一些优势。 【参考方案1】:

问题在于,因为 Maven 构建文件 (pom.xml) 中有太多插件,所以我认为 Gradle 也需要它们。这是一个很大的错误,因为 Gradle 的 build.gradle 文件只需要最少的插件信息。其余的会自动下载和使用。

在我的例子中,它只需要 GWT 的 Gradle 版本,gwt-gradle-plugin 插件。

经过修正和极大简化的 build.gradle 变为:

// This must be before plugins!
buildscript 
    repositories 
      mavenCentral()
    
    dependencies 
        classpath "org.wisepersist:gwt-gradle-plugin:1.0.8"
    


plugins 
    id 'java'


repositories 
    mavenLocal()
    maven 
        url = 'https://plugins.gradle.org/m2/'
        url = 'http://repo.maven.apache.org/maven2'
    


dependencies 
    implementation 'com.google.gwt:gwt-user:2.8.2'
    implementation 'com.google.gwt:gwt-dev:2.8.2'


apply plugin: 'gwt-compiler'
...

现在您可以运行:gradle compileGwt --console verbose --info 并且所有文件都将构建在 ./build 目录中。

【讨论】:

自从我上次使用Maven已经很久了,我完全忘记了它需要明确写出依赖的每一个依赖!事实上,我什至不确定它是否如此,但这似乎意味着......

以上是关于如何迁移基于 Maven 的 Web 应用程序 POM 以使用 Gradle?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用IntelliJ IDEA 14创建基于Maven3的Java Web Project

从 web.xml 迁移到基于 Java 的配置 - 无法启动 Tomcat 8

web的自己主动化公布

如何将Maven项目转为Java Web项目

如何快速高效地开发和调试基于gradle管理的web应用

如何使用 GitHub 中的 Maven 从 NetBeans 项目迁移到 Java CI?