使用gradle构建Java项目
Gradle和许多插件在一起运行。插件是Gradle的扩展,它以某种方式配置我们的项目,最典型的做法是添加一些预先配置好的用于做某些有用的事情的task。Gradle有很多插件,本例将用到的插件就是Java插件。
Java项目介绍
大部分Java项目的构建都十分相似:
- 编译Java源码文件。
- 运行一些单元测试并且创建一个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
- 点赞
- 收藏
- 关注作者
评论(0)