Как перенести POM веб-приложения на основе Maven для использования Gradle? - PullRequest
0 голосов
/ 04 марта 2019

Да, да, я знаю!Здесь есть сотни вопросов, связанных с Maven-to-Gradle, в SO, но ни один из них, AFAICT, не рассматривает врожденные трудности (постоянно движущейся цели [Gradle!]) Переноса очень простого POM Maven для использования Gradle для компиляции.

В этом конкретном случае у нас есть приложение, на которое исходные разработчики рассчитывают использовать плагин GWT для Eclipse, но многие другие разработчики хотели бы использовать что-то более современное и менее раздутое, например Gradle .Все источники просто отмахиваются от этого, "you can simply convert pom.xml in Gradle", как указано в документации Gradle, к сожалению это просто не работает для большинства практических целей .

Рассматриваемый проект - circuitJS1 , который был перенесен для использования Maven здесь .В результате 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 работал правильно для создания веб-файлов, необходимых для локального запуска приложения в моем браузере?
  • Существуют ли какие-либо современные инструменты, доступныечто может сделать это для вас?

1 Ответ

0 голосов
/ 14 марта 2019

Проблема заключалась в том, что поскольку в файле сборки Maven (pom.xml) было так много плагинов, что я подумал, что они нужны и в Gradle .Это большая ошибка, потому что файл Gradle build.gradle требует только минимальной информации о плагине.Остальное загружается и используется автоматически.

В моем случае ему понадобилась только версия Gradle GWT , плагин 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.

...