关闭

Java动态加载结合gradle的多模块构建

标签: javagradle
792人阅读 评论(0) 收藏 举报
分类:

本次实验Java的动态加载依赖lib/StartModule.jar文件:

public class Main {
    public static void main(String[] args) throws Exception{
        File jarFile = new File("lib/StartModule.jar");
        URI uri = jarFile.toURI();
        URLClassLoader classLoader = new URLClassLoader(new URL[]{uri.toURL()});
        Class<?> init = classLoader.loadClass("Init");
        MyAction action = (MyAction) init.newInstance();
        action.action();
    }
}

那么怎样避免每次生成StartModule.jar的时候需要手动生成jar呢?(jar cvf StartModule.jar classes/)
那就是使用Gradle的自动构建了。
首先新建一个Module tartModule,这时候的目录树为(这里我省略了一些不重要的目录):

│  build.gradle
│  gradlew
│  gradlew.bat
│  settings.gradle
│  Test.iml
│          
├─gradle
│          
├─lib
├─src
│  ├─main
│  │  ├─java
│  │  │      Main.java
│  │  │      MyAction.java
│  │  │      
│  │  └─resources
│  └─test
│      ├─java
│      └─resources
└─StartModule
    │  build.gradle
    │  StartModule.iml
    │  
    └─src
        ├─main
        │  ├─java
        │  │      Init.java
        │  │      
        │  └─resources
        └─test
            ├─java
            └─resources

/src/main/java/MyAction是一个接口:

public interface MyAction {
    void action();
}

用来实现动态加载,模块StartModule中的类Init实现了MyAction这个接口:

public class Init implements MyAction {
    @Override
    public void action() {
        System.out.println("HAHAHAHA");
    }
}

为了能够一键生成StartModule的jar并且把生成的jar拷贝到/lib下,就必须配置Gradle的构建脚本了。
首先看StartModule下的build.gradle文件:

group 'xyz.bpazy'
version ''

apply plugin: 'java'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
    compile project(':') //添加依赖根目录,才可以使用MyAction接口
}

//添加一个task,作用为生成jar,生成的jar的目录在该moudle下的/build/libs中
task makeJar(type: Jar) {
    baseName 'StartModule' //baseName用来指定生成的jar的名称,jar名称的形式为[$baseName-$version.jar],所以为了方便我把version的值设为空
    from('build/classes/main') //指定要添加到jar文件的.class文件的路径
}

//这个task是用来清除已经生成的jar
task clearJar(type: Delete) {
    delete 'build/libs'
}

//指定执行makeJar这个task依赖clearJar和build,也就是执行makeJar之前会先clearJar, build,然后才makeJar
makeJar.dependsOn(clearJar, build)

至此我们已经生成了jar,但是这个jar的目录不在正确的地方。

现在打开工程的根`build.gradle’:

group 'xyz.bpazy'
version '1.0-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'application' //这个插件的作用是为gradle添加一个run的task,gradle run 就是直接执行主类的main方法

mainClassName = "Main" //指定run task的主类

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
}

//添加task release,类型是Copy
task release(type: Copy) {
    //把`/StartModule/build/libs`下的所有jar文件拷贝到`/lib`文件夹下
    from('StartModule/build/libs') {
        include '*.jar'
    }
    into('lib')
}

//为release添加指定的依赖,这个依赖是子模块中的task,格式为[:$moduleName:$taskName]
release.dependsOn(':StartModule:makeJar')

//为run添加指定的依赖release
run.dependsOn('release')

在这样的配置下,我们执行命令gradle run,因为层层依赖,所以执行顺序是:
:StartModule:clearJar->:StartModule:build->:StartModule:makeJar->:release->:run

测试一下是否成功

D:\Project\Java\Test>gradlew run
:compileJava                                                    
:processResources UP-TO-DATE     
:classes                 
:jar                 
:StartModule:compileJava                                                                 
:StartModule:processResources UP-TO-DATE      
:StartModule:classes                 
:StartModule:jar                 
:StartModule:assemble                 
:StartModule:compileTestJava UP-TO-DATE      
:StartModule:processTestResources UP-TO-DATE      
:StartModule:testClasses UP-TO-DATE      
:StartModule:test UP-TO-DATE      
:StartModule:check UP-TO-DATE      
:StartModule:build                 
:StartModule:clearJar                 
:StartModule:makeJar                 
:release                 
:run                                                     
HAHAHAHA             

BUILD SUCCESSFUL

Total time: 3.686 secs

动态加载/lib/StartModule.jar成功了.

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

配置settings.gradle笔记

学习笔记...算不得原创.. //声明加入project 一个apk 或一个lib都叫一个project 一个project有一个build.gradle文件 //三个对象 gradle对象(执行命令...
  • sinat_35073873
  • sinat_35073873
  • 2016-11-21 20:20
  • 4369

从零开始学习Gradle之三---多项目构建

随着信息化的快速发展,IT项目变得越来越复杂,通常都是由多个子系统共同协作完成。对于这种多系统、多项目的情况,很多构建工具都已经提供了不错的支持,像maven、ant。Gradle除了借鉴了ant或者...
  • meegomeego
  • meegomeego
  • 2014-09-21 18:01
  • 7298

[Gradle中文教程系列]-跟我学Gradle-8.7.多模块项目之 - spring boot + gradle + 构建公共jsp页面的多模块项目

多模块项目之 - spring boot + gradle + 构建公共jsp页面的多模块项目标题党!!!!烹制原理Servlet 3.1 规范里 jar包中META-INF/resources/下...
  • pkaq_
  • pkaq_
  • 2016-12-02 15:22
  • 1724

Gradle构建多模块项目(整合Java SE 和 Springboot)

参考于 xiejx618的专栏:gradle多模块开发 全部源码在github上 完整源码,点击下载 https://github.com/Kuangcp/GradleIntegratio...
  • kcp606
  • kcp606
  • 2017-06-08 20:17
  • 1300

Extjs创建多个controller实现多模块MVC动态加载

首先将 Ext.application({     name: 'IV',     appFolder: 'js/app',     autoCreateView...
  • gaoqiao1988
  • gaoqiao1988
  • 2013-09-17 09:54
  • 1810

Extjs4.2 动态加载项目(权限模块)

  • 2014-11-25 20:39
  • 32.63MB
  • 下载

嵌入式系统中的模块动态加载技术

  • 2017-02-18 13:45
  • 201KB
  • 下载

动态加载模块

  • 2007-04-03 16:44
  • 38KB
  • 下载

Java 动态加载jar文件示例

  • 2015-01-23 16:12
  • 14KB
  • 下载

APK加固(JAVA/JNI二种方式动态加载dex)

  • 2016-02-02 18:20
  • 211KB
  • 下载
    文章分类
    个人资料
    • 访问:15281次
    • 积分:744
    • 等级:
    • 排名:千里之外
    • 原创:61篇
    • 转载:0篇
    • 译文:0篇
    • 评论:4条
    最新评论