如何迁移基于 Maven 的 Web 应用程序 POM 以使用 Gradle?
How to migrate a Maven based web application POM to use Gradle?
是的,是的,我知道! SO 上有数百个 Maven-to-Gradle 相关问题,但是其中 none,AFAICT 解决了移植的固有困难(不断移动的目标 [Gradle!])一个非常简单的 Maven POM,使用 Gradle 进行编译。
在这种特殊情况下,我们有一个应用程序,原始开发人员依赖于使用 Eclipse 的 GWT 插件,但许多其他开发人员希望使用更现代且不那么臃肿的东西,即 Gradle。所有来源都简单地将其刷掉,"you can simply convert pom.xml in Gradle"
,就像 Gradle 文档中的 stated 一样,不幸的是 这根本不是为最实际的目的工作。
正在考虑的项目是circuitJS1 which was ported to use 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
脚本正常工作以在我的浏览器中本地生成 运行 应用程序所需的 Web 文件?
- 是否有可以为您执行此操作的最新工具?
问题是因为 Maven 构建文件 (pom.xml
) 中有太多插件,所以我认为 Gradle[=32 中也需要它们=].这是一个很大的错误,因为 Gradle 的 build.gradle
文件只需要最少的插件信息。其余部分自动下载和使用。
在我的例子中,它只需要 Gradle 版本的 GWT, the 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
目录中。
是的,是的,我知道! SO 上有数百个 Maven-to-Gradle 相关问题,但是其中 none,AFAICT 解决了移植的固有困难(不断移动的目标 [Gradle!])一个非常简单的 Maven POM,使用 Gradle 进行编译。
在这种特殊情况下,我们有一个应用程序,原始开发人员依赖于使用 Eclipse 的 GWT 插件,但许多其他开发人员希望使用更现代且不那么臃肿的东西,即 Gradle。所有来源都简单地将其刷掉,"you can simply convert pom.xml in Gradle"
,就像 Gradle 文档中的 stated 一样,不幸的是 这根本不是为最实际的目的工作。
正在考虑的项目是circuitJS1 which was ported to use 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
脚本正常工作以在我的浏览器中本地生成 运行 应用程序所需的 Web 文件? - 是否有可以为您执行此操作的最新工具?
问题是因为 Maven 构建文件 (pom.xml
) 中有太多插件,所以我认为 Gradle[=32 中也需要它们=].这是一个很大的错误,因为 Gradle 的 build.gradle
文件只需要最少的插件信息。其余部分自动下载和使用。
在我的例子中,它只需要 Gradle 版本的 GWT, the 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
目录中。