使用gradle构建Java项目

举报
yd_221104950 发表于 2020/12/02 22:51:49 2020/12/02
【摘要】 Gradle和许多插件在一起运行。插件是Gradle的扩展,它以某种方式配置我们的项目,最典型的做法是添加一些预先配置好的用于做某些有用的事情的task。Gradle有很多插件,本例将用到的插件就是Java插件。 Java项目介绍 大部分Java项目的构建都十分相似: 编译Java源码文件。运行一些单元测试并且创建一个JAR文件来包含你的class文件。 Gro...

Gradle和许多插件在一起运行。插件是Gradle的扩展,它以某种方式配置我们的项目,最典型的做法是添加一些预先配置好的用于做某些有用的事情的task。Gradle有很多插件,本例将用到的插件就是Java插件。

Java项目介绍

大部分Java项目的构建都十分相似:

  1. 编译Java源码文件。
  2. 运行一些单元测试并且创建一个JAR文件来包含你的class文件。

Groovy通过使用Gradle的Java插件来自动完成上述两个步聚。这个插件会添加许多task到项目中,这些task会编译和测试我们的Java源码,并且把它打包进JAR文件中。

Gradle Java插件介绍

Java插件是基于约定的。就是说在项目的许多方面该插件都定义了默认值,如Java源码放置路径等。如果项目遵守约定,那么我们的构建脚本中通常就不需要做太多的事情就可以完成一个项目的构建。对Java项目的支持是以一个插件的形式来实现的,如果我们不想遵守Java插件的约定,可以在构建Java项目时不使用这个插件。

Gradle Java插件有以下约定:

  • 存放项目源码:src/main/java
  • 存放测试源码:src/test/java
  • 存放资源文件:src/main/resources
  • 在src/test/resources目录下的任何文件都会被添加到classpath中用于运行测试
  • 所有的输出文件都被创建在build目录里,其中JAR文件在build/libs目录里

列出Gradle Java插件在项目中添加的task:

~/Desktop/gr$ gradle task

> Task :tasks

------------------------------------------------------------
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 main classes.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the main classes.
testClasses - Assembles test classes.

Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.

Documentation tasks
-------------------
javadoc - Generates Javadoc API documentation for the main source code.

Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'gr'.
components - Displays the components produced by root project 'gr'. [incubating]
dependencies - Displays all dependencies declared in root project 'gr'.
dependencyInsight - Displays the insight into a specific dependency in root project 'gr'.
dependentComponents - Displays the dependent components of components in root project 'gr'. [incubating]
help - Displays a help message.
model - Displays the configuration model of root project 'gr'. [incubating]
projects - Displays the sub-projects of root project 'gr'.
properties - Displays the properties of root project 'gr'.
tasks - Displays the tasks runnable from root project 'gr'.

Verification tasks
------------------
check - Runs all checks.
test - Runs the unit tests.

Rules
-----
Pattern: clean<TaskName>: Cleans the output files of a task.
Pattern: build<ConfigurationName>: Assembles the artifacts of a configuration.
Pattern: upload<ConfigurationName>: Assembles and uploads the artifacts belonging to a configuration.

To see all tasks and more detail, run gradle tasks --all

To see more detail about a task, run gradle help --task <task>

BUILD SUCCESSFUL in 2s
1 actionable task: 1 executed


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59

构建Java项目的过程

(1)使用java插件,只需要在build.gradle文件中添加以下内容,这将会应用Java插件到你的项目中,它会添加一些task到我们的项目中。

apply plugin: 'java'

  
 
  • 1

(2)按照Java插件的约定,创建各个目录

~/Desktop/gr$ mkdir -p src/main/java
~/Desktop/gr$ mkdir -p src/test/java
~/Desktop/gr$ mkdir -p src/main/resources
~/Desktop/gr$ ls -R
.:
build.gradle  src

./src:
main  test

./src/main:
java  resources

./src/main/java:

./src/main/resources:

./src/test:
java

./src/test/java:
~/Desktop/gr$

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

(3)在各个目录里放入相应的文件,为了方便演示,我们只加项目源码文件:

/*建包名*/
~/Desktop/gr/src/main/java$ mkdir -p com/wong/ai
~/Desktop/gr$ touch src/main/java/com/wong/ai/Hello.java
~/Desktop/gr$ vim src/main/java/com/wong/ai/Hello.java
~/Desktop/gr$ cat src/main/java/com/wong/ai/Hello.java
package com.wong.ai;

public class Hello{
	public static void main(String[] args){
		System.out.println("Hello World");
	}
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

(4)构建项目

~/Desktop/gr$ gradle build

BUILD SUCCESSFUL in 3s
2 actionable tasks: 2 executed

  
 
  • 1
  • 2
  • 3
  • 4

Java插件添加了许多task到我们的项目中。然而,只有少量的task是你需要在项目中使用的。最常用的task是build,它可以构建完整的项目。当你运行gradle build命时,Gradle将会编译和测试我们的代码,并且创建一个JAR文件来包含我们的主要class和资源文件。
(5)查看编译后的结果
所有的输出文件都被创建在build目录里,其中JAR文件在build/libs目录里。

~/Desktop/gr$ ls -R build
build:
classes  generated  libs  tmp

build/classes:
java

build/classes/java:
main

build/classes/java/main:
com

build/classes/java/main/com:
wong

build/classes/java/main/com/wong:
ai

build/classes/java/main/com/wong/ai:
Hello.class

build/generated:
sources

build/generated/sources:
annotationProcessor

build/generated/sources/annotationProcessor:
java

build/generated/sources/annotationProcessor/java:
main

build/generated/sources/annotationProcessor/java/main:

build/libs:
gr.jar

build/tmp:
compileJava  jar

build/tmp/compileJava:

build/tmp/jar:
MANIFEST.MF


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

(6)运行gr.jar文件

~/Desktop/gr/build/libs$ java -jar gr.jar
no main manifest attribute, in gr.jar

  
 
  • 1
  • 2

正常情况下,java打包成jar包需要在MANIFEST.MF中指定Main-Class项以便运行java -jar XXX.jar时找到对应的主类。因为-jar的含义就是后面跟的jar包是有main class可独立运行,所以需要在打包成jar包时指定这个类。这个问题的解决办法:

  • 运行时指定运行的主类,如:
    格式:java -cp jar文件 主类路径
~/Desktop/gr/build/libs$ java -cp gr.jar com.wong.ai.Hello
Hello World

  
 
  • 1
  • 2
  • 在MANIFEST.MF中指定Main-Class项。
    (1)将gr.jar改成gr.zip,然后解压出来。或者使用jar命令解压,格式:
jar -xvf jar文件

  
 
  • 1

对gr.jar文件进行解压,得com、META-INF两个目录:

~/Desktop/gr/build/libs$ jar -xvf gr.jar
  created: com/
  created: com/wong/
  created: com/wong/ai/
 inflated: com/wong/ai/Hello.class
  created: META-INF/
 inflated: META-INF/MANIFEST.MF
~/Desktop/gr/build/libs$ ls
com  gr.jar  META-INF
~/Desktop/gr/build/libs$ ls -R META-INF
META-INF:
MANIFEST.MF

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

对META-INF/MANIFEST.MF文件进行配置,添加Main-Class项:

Manifest-Version: 1.0
Main-Class: com.wong.ai.Hello

  
 
  • 1
  • 2

将修改好的com、META-INF打成jar包(jar包也是压缩包),有以下几种方式:
1、先将com、META-INF压缩成.zip包,再将.zip改成.jar即可。
2、用jar命令打包:

/*删除掉所有生成的jar包*/
~/Desktop/gr/build/libs$ rm -f *.jar
/*将com、META-INF目录打成jar包,参数-M是不生成MANIFEST.MF文件,否则改好的文件会被覆盖掉*/
~/Desktop/gr/build/libs$ jar -cfM gr.jar com META-INF
~/Desktop/gr/build/libs$ ls
com  gr.jar  META-INF
/*成功运行*/
~/Desktop/gr/build/libs$ java -jar gr.jar
Hello World


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

(3)使用jar命令,向jar添加MANIFEST.MF文件,在文件中加入Main-Class项
新建一个文件MANIFEST.MF,内容如下:

Manifest-Version: 1.0
Main-Class: com.wong.ai.Hello

  
 
  • 1
  • 2

使用jar命令打包

/*将.class类目录打进jar包*/
~/Desktop/gr/build/libs$ jar -cfM gr.jar com
/*向jar添加MANIFEST.MF文件*/
~/Desktop/gr/build/libs$ jar -umf MANIFEST.MF gr.jar
~/Desktop/gr/build/libs$ java -jar gr.jar
Hello World

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

(7)补充
如果我们的jar不需要主类,那么gradle build编译出来的包,就可以直接拿到其他项目里去用了。

谢谢阅读

文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_40763897/article/details/103519535

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。