这篇博客文章描述了如何使用Gradle编译和打包一个简单的Java项目。
我们的Java项目只有一个要求:
我们的构建脚本必须创建一个可执行的jar文件。 换句话说,我们必须能够使用以下命令运行程序:
java -jar jarfile.jar
让我们找出如何满足这一要求。
创建一个Java项目
我们可以通过应用Java插件来创建Java项目。 我们可以通过在build.gradle文件中添加以下行来实现 :
apply plugin: 'java'
这就对了。 现在,我们已经创建了一个Java项目。
Java插件为我们的构建添加了新的约定(例如,默认的项目布局), 新的任务和新的属性 。
让我们继续前进,快速浏览一下默认的项目布局。
Java项目的项目布局
Java项目的默认项目布局如下:
- src / main / java目录包含我们项目的源代码。
- src / main / resources目录包含我们项目的资源(例如属性文件)。
- src / test / java目录包含测试类。
- src / test / resources目录包含测试资源。
我们构建的所有输出文件都在构建目录下创建 。 该目录包含与该博客文章相关的以下子目录(也有其他子目录,但以后我们将讨论它们):
- classes目录包含已编译的.class文件。
- libs目录包含由构建创建的jar或war文件。
让我们继续并将简单的主类添加到我们的项目中。
在我们的版本中添加主类
让我们创建一个简单的主类,该主类将单词“ Hello World”输出到System.out 。 HelloWorld类的源代码如下所示:
package net.petrikainulainen.gradle;public class HelloWorld {public static void main(String[] args) {System.out.println("Hello World!");}
}
HelloWorld类已添加到src / main / java / net / petrikainulainen / gradle目录。
那很好。 但是,我们仍然必须编译和打包我们的项目。 让我们继续看一下Java项目的任务。
Java项目的任务
Java插件向我们的构建中添加了许多任务,但是与此博客文章相关的任务是:
- 组装任务将编译应用程序的源代码并将其打包到jar文件中。 此任务不会运行单元测试。
- 构建任务执行项目的完整构建。
- clean任务删除构建目录。
- compileJava任务编译我们应用程序的源代码。
我们还可以通过在命令提示符处运行以下命令来获取可运行任务及其描述的完整列表:
gradle tasks
这是获得我们的项目的简要概述的一种好方法,而无需阅读构建脚本。 如果在示例项目的根目录中运行此命令,则会看到以下输出:
> gradle tasks
:tasks------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildNeeded - Assembles and tests this project and all projects it depends on.
classes - Assembles classes 'main'.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the main classes.
testClasses - Assembles classes 'test'.Build Setup tasks
-----------------
init - Initializes a new Gradle build. [incubating]
wrapper - Generates Gradle wrapper files. [incubating]Documentation tasks
-------------------
javadoc - Generates Javadoc API documentation for the main source code.Help tasks
----------
dependencies - Displays all dependencies declared in root project 'first-java-project'.
dependencyInsight - Displays the insight into a specific dependency in root project 'first-java-project'.
help - Displays a help message
projects - Displays the sub-projects of root project 'first-java-project'.
properties - Displays the properties of root project 'first-java-project'.
tasks - Displays the tasks runnable from root project 'first-java-project'.Verification tasks
------------------
check - Runs all checks.
test - Runs the unit tests.Rules
-----
Pattern: build<ConfigurationName>: Assembles the artifacts of a configuration.
Pattern: upload<ConfigurationName>: Assembles and uploads the artifacts belonging to a configuration.
Pattern: clean<TaskName>: Cleans the output files of a task.To see all tasks and more detail, run with --all.BUILD SUCCESSFULTotal time: 2.792 secs
让我们继续前进,了解如何打包Java项目。
打包我们的Java项目
我们可以使用两个不同的任务来打包应用程序:
如果在命令提示符处运行命令gradle组装 ,我们将看到以下输出:
> gradle assemble
:compileJava
:processResources
:classes
:jar
:assembleBUILD SUCCESSFULTotal time: 3.163 secs
如果在命令提示符处运行命令gradle build , 则将看到以下输出:
> gradle build
:compileJava
:processResources
:classes
:jar
:assemble
:compileTestJava
:processTestResources
:testClasses
:test
:check
:buildBUILD SUCCESSFULTotal time: 3.01 secs
这些命令的输出表明,这些任务的不同之处在于:
- 组装任务仅运行打包我们的应用程序所需的任务。
- 构建任务运行打包我们的应用程序所需的任务,并运行自动化测试。
这两个命令都将first-java-project.jar文件创建到build / libs目录。
通过使用以下模板创建创建的jar文件的默认名称: [项目名称] .jar ,并且该项目的默认名称与创建它的目录的名称相同。 因为我们的项目目录的名称是first-java-project ,所以创建的jar的名称是first-java-project.jar 。
现在,我们可以尝试使用以下命令来运行我们的应用程序:
java -jar first-java-project.jar
执行此操作时,将看到以下输出:
> java -jar first-java.project.jar
No main manifest attribute, in first-java-project.jar
问题是我们尚未在清单文件中配置jar文件的主类。 让我们找出如何解决这个问题。
配置jar文件的主类
Java插件向我们的项目添加了一个jar任务 ,每个jar对象都有一个manifest属性,该属性是Manifest的一个实例。
我们可以使用Manifest接口的attribute()方法配置创建的jar文件的主类。 换句话说,我们可以使用包含键值对的映射来指定添加到清单文件的属性。
我们可以通过设置Main-Class属性的值来设置应用程序的入口点。 在对build.gradle文件进行了必要的更改之后,其源代码如下所示(相关部分已突出显示):
apply plugin: 'java'jar {manifest {attributes 'Main-Class': 'net.petrikainulainen.gradle.HelloWorld'}
}
Java SE教程提供了有关清单文件的更多信息 。
通过运行gradle assemble或gradle build命令创建新的jar文件之后,可以使用以下命令运行jar文件:
java -jar first-java-project.jar
当我们运行应用程序时,以下文本将打印到System.out :
> java -jar first-java-project.jar
Hello World!
今天就这些。 让我们找出从这篇博客文章中学到的知识。
摘要
现在,我们使用Gradle创建了一个简单的Java项目。 这篇博客文章教会了我们四件事:
- 我们知道可以通过应用Gradle Java插件来创建Java项目。
- 我们了解到Java项目的默认目录布局与Maven项目的默认目录布局相同。
- 我们了解到,可以从构建目录中找到由构建生成的所有输出文件。
- 我们学习了如何自定义添加到清单文件的属性。
PS此博客文章的示例项目可在Github上获得 。
翻译自: https://www.javacodegeeks.com/2014/06/getting-started-with-gradle-our-first-java-project.html