如何创建Java Gradle项目

130
如何从命令行创建Java Gradle项目?
应该创建标准的maven文件夹布局,如下图所示:http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html Java Gradle created with Eclipse plugin 更新: 1. 从http://www.gradle.org/docs/current/userguide/tutorial_java_projects.html中,我需要创建一个包含2行代码的build.gradle文件:
apply plugin: 'java'
apply plugin: 'eclipse'

.2. 在build.gradle任务下方添加以下代码,然后执行gradle create-dirs

task "create-dirs" << {
   sourceSets*.java.srcDirs*.each { it.mkdirs() }
   sourceSets*.resources.srcDirs*.each { it.mkdirs() }
}

.3. 然后运行gradle eclipse命令(或使用其他IDE插件配置的相应字符串)

那么是否有一条命令可以完成这个过程?


1
有人知道 IntelliJ Java 项目骨架的等效物吗? - Beezer
我认为答案显然超出了......或者对应的字符串配置到其他IDE插件中 :=) - Beezer
8个回答

299

创建一个Java项目:创建一个新的项目目录,进入该目录并执行以下命令

gradle init --type java-library

将会构建源文件夹和Gradle构建文件(包括wrapper)。


8
如其他答案中所提到的,构建初始化插件的文档可以在此处找到:http://www.gradle.org/docs/current/userguide/build_init_plugin.html。 - Paul
在Eclipse中执行此操作之前,Java项目必须转换为Gradle项目。那么,我该如何自动设置源文件夹呢?非常好。 - verystrongjoe
一个重要的事情。你必须拥有包含init插件的Gradle版本。我花了很多时间才弄清楚我的gradle出了什么问题。 - Юрій Мазуревич
8
请使用 mkdir -p src/{main,test}/{java,resources} 命令来创建目录结构。此命令将自动创建 src 目录,并在其中创建 maintest 两个子目录,然后在这两个子目录下分别创建 javaresources 子目录。注意,在输入命令时请确保使用正确的语法和拼写。 - Ortwin Angermeier
3
如果您想指定包装器版本,可以使用以下命令:gradle wrapper --gradle-version 4.1 init --type java-library。该命令可用于初始化一个Java库项目。 - deFreitas

19

Gradle团队正在尽最大努力解决所有(你的)问题。他们最近(自1.9版本以来)新增了一个新功能(孵化): "build init" 插件。

详见:构建初始化插件文档


13
最终比较了所有解决方案后,我认为从build.gradle文件开始会更方便。
Gradle分发包中有很多示例的samples文件夹,还有gradle init --type basic命令,请参见第47章。构建初始化插件。但是它们都需要进行一些编辑。
您也可以使用下面的template,然后运行gradle initSourceFolders eclipse
/*
* Nodeclipse/Enide build.gradle template for basic Java project
*   https://github.com/Nodeclipse/nodeclipse-1/blob/master/org.nodeclipse.enide.editors.gradle/docs/java/basic/build.gradle
* Initially asked on
*   https://dev59.com/o2Yr5IYBdhLWcg3wAFvE
* Usage
*   1. create folder (or general Eclipse project) and put this file inside
*   2. run `gradle initSourceFolders eclipse` or `gradle initSourceFolders idea`
* @author Paul Verest; 
* based on `gradle init --type basic`, that does not create source folders 
*/

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'

task initSourceFolders { // add << before { to prevent executing during configuration phase
   sourceSets*.java.srcDirs*.each { it.mkdirs() }
   sourceSets*.resources.srcDirs*.each { it.mkdirs() }
}

task wrapper(type: Wrapper) {
    gradleVersion = '1.11'
}

// In this section you declare where to find the dependencies of your project
repositories {
    // Use Maven Central for resolving your dependencies.
    // You can declare any Maven/Ivy/file repository here.
    mavenCentral()
}

// In this section you declare the dependencies for your production and test code
dependencies {
    //compile fileTree(dir: 'libs', include: '*.jar')
    // The production code uses the SLF4J logging API at compile time
    //compile 'org.slf4j:slf4j-api:1.7.5'

    // Declare the dependency for your favourite test framework you want to use in your tests.
    // TestNG is also supported by the Gradle Test task. Just change the
    // testCompile dependency to testCompile 'org.testng:testng:6.8.1' and add
    // 'test.useTestNG()' to your build script.
    testCompile "junit:junit:4.11"
}

结果如下所示。

overview

这可以在没有任何Gradle插件的情况下使用,
或者使用(Enide) Gradle for Eclipse,Jetty,Android作为Gradle Integration for Eclipse的替代方案

editbox


13

很遗憾,您不能只用一个命令来完成此操作。有一个针对这一特性的开放性问题

目前您需要手动完成此操作。如果您需要经常这样做,可以创建一个自定义Gradle插件,或者只需准备好自己的项目框架并在需要时复制它。

编辑

上述提到的JIRA问题已于2013年5月1日解决,并已在1.7-rc-1中修复。关于Build Init插件的文档已经发布,尽管它表明此功能仍处于“孵化”生命周期。


2

以下是我成功创建一个带有外部jar依赖的Hello World Java应用程序,并满足以下要求的Gradle解决方案:

  1. 应用程序具有外部jar依赖项
  2. 创建一个可运行的fat jar文件,其中包含所有依赖类的副本
  3. 创建一个可运行的jar文件,其中包含所有依赖库的副本,并在清单中添加类路径。
  • 安装最新版本的gradle(检查gradle --version。我使用的是gradle 6.6.1)
  • 创建一个文件夹并打开终端
  • 执行 gradle init --type java-application
  • 在命令行中添加所需的数据
  • 将项目导入IDE(IntelliJ或Eclipse)
  • 使用以下任务编辑build.gradle文件。

可运行的fat Jar

task fatJar(type: Jar) {
 clean
 println("Creating fat jar")
 manifest {
    attributes 'Main-Class': 'com.abc.gradle.hello.App'
 }
 archiveName "${runnableJar}"
 from {
    configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
 } with jar
 println("Fat jar is created")
}

复制依赖项

task copyDepends(type: Copy) {
   from configurations.default
   into "${dependsDir}"
}

使用清单文件创建包含classpath依赖项的jar包

task createJar(type: Jar) {
   println("Cleaning...")
   clean
   manifest {
    attributes('Main-Class': 'com.abc.gradle.hello.App',
            'Class-Path': configurations.default.collect { 'dependencies/' + 
             it.getName() }.join(' ')
    )
}
  from {
      configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
  } with jar
  println "${outputJar} created"
}

这里是完整的 build.gradle 文件

plugins {
    id 'java'
   id 'application'
}
repositories {
    mavenCentral()
}
dependencies {
  implementation 'org.slf4j:slf4j-api:1.7.30'
  implementation 'ch.qos.logback:logback-classic:1.2.3'
  implementation 'ch.qos.logback:logback-core:1.2.3'
  testImplementation 'junit:junit:4.13'
}
def outputJar = "${buildDir}/libs/${rootProject.name}.jar"
def dependsDir = "${buildDir}/libs/dependencies/"
def runnableJar = "${rootProject.name}_fat.jar";

//Create runnable fat jar
task fatJar(type: Jar) {
   clean
   println("Creating fat jar")
   manifest {
    attributes 'Main-Class': 'com.abc.gradle.hello.App'
  }
  archiveName "${runnableJar}"
  from {
    configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
  } with jar
  println("Fat jar is created")
}

//Copy dependent libraries to directory.
task copyDepends(type: Copy) {
 from configurations.default
 into "${dependsDir}"
}

//Create runnable jar with dependencies
task createJar(type: Jar) {
 println("Cleaning...")
 clean
 manifest {
    attributes('Main-Class': 'com.abc.gradle.hello.App',
            'Class-Path': configurations.default.collect { 'dependencies/' + 
            it.getName() }.join(' ')
    )
 }
 from {
     configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
 } with jar
  println "${outputJar} created"
}

Gradle构建命令
创建fat jar : gradle fatJar
复制依赖项 : gradle copyDepends
创建可运行的带有依赖项的jar包 : gradle createJar

更多细节可以在这里阅读:https://jafarmlp.medium.com/a-simple-java-project-with-gradle-2c323ae0e43d


1

我可以使用build.gradle中的Groovy方法来处理它,以创建所有Java、资源和测试的源文件夹。然后我将其设置为在gradle eclipse任务之前运行。

eclipseClasspath.doFirst {
    initSourceFolders()
}

def initSourceFolders() {
    sourceSets*.java.srcDirs*.each { it.mkdirs() }
    sourceSets*.resources.srcDirs*.each { it.mkdirs() }
}

现在我们可以使用一个命令在eclipse中设置一个新的gradle Java EE项目。我将这个例子放在GitHub上。

1
如果您正在使用Eclipse,对于一个已经存在的项目(其中包含一个build.gradle文件),您只需输入gradle eclipse即可为该项目创建所有Eclipse文件和文件夹。它会自动处理所有依赖关系,并将它们添加到Eclipse中的项目资源路径中。

2
这不会创建源文件夹。如果它们以前未被创建,Eclipse 配置将不完整。尽管如此,非常感谢,作为第3步添加。 - Paul Verest

-2

我刚刚尝试了使用Eclipse Neon.1和Gradle:

------------------------------------------------------------
Gradle 3.2.1
------------------------------------------------------------

Build time:   2016-11-22 15:19:54 UTC
Revision:     83b485b914fd4f335ad0e66af9d14aad458d2cc5

Groovy:       2.4.7
Ant:          Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM:          1.8.0_112 (Oracle Corporation 25.112-b15)
OS:           Windows 10 10.0 amd64

enter image description here

在Windows 10上,使用Java版本:

C:\FDriveKambiz\repo\gradle-gen-project>java -version
java version "1.8.0_112"
Java(TM) SE Runtime Environment (build 1.8.0_112-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.112-b15, mixed mode)

正如你在Eclipse中看到的那样,它失败得很惨。 但在Intellij中却像一只翱翔的鹰一样顺利...我不了解Intellij,也是Eclipse的忠实粉丝,但是,这意味着没有人测试过Neon.1最简单的用例——导入gradle项目。 这还不够好。 我要转向Intellij来处理gradle项目:

enter image description here


1
问题是:如何通过命令行创建Java Gradle项目? - Paul Verest
在这种情况下,保罗,帮助有什么问题吗?它是在同一上下文中。那么,为什么不显示eclipse当前导入它存在问题呢? - Beezer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接