如何从java代码运行gradle任务?

2024-02-27

我需要从 java 方法将 gradle eclipse 任务运行到外部 gradle 项目,是否可以使用 Gradle Tooling API 来完成此操作?


The 摇篮论坛 https://discuss.gradle.org/t/execute-gradle-task-from-java-code/21859/4给出了以编程方式执行此操作的一个很好的示例,但由于它忽略了项目的单独 gradle 包装器,因此它不能保证构建的顺利执行,甚至会破坏您的应用程序。有关为什么您始终应该依赖 gradle 包装器的更多信息,请阅读here https://medium.com/@bherbst/understanding-the-gradle-wrapper-a62f35662ab7 and here https://docs.gradle.org/current/userguide/gradle_wrapper.html.

使用 Gradle 包装器

推荐的方法是运行exec https://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html并调用项目包装器,同时将任务作为参数传递。此示例调用当前项目包装器并传递jar作为参数:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Main
{
    private static String PATH_TO_GRADLE_PROJECT = "./";
    private static String GRADLEW_EXECUTABLE = "gradlew.bat";
    private static String BLANK = " ";
    private static String GRADLE_TASK = "jar";

    public static void main(String[] args)
    {
        String command = PATH_TO_GRADLE_PROJECT + GRADLEW_EXECUTABLE + BLANK + GRADLE_TASK;
        try
        {
            Runtime.getRuntime().exec(command);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

使用 Gradle 工具 API

要在外部项目上使用 Gradle 工具 api,您只需定义属性forProjectDirectory你的GradleConnector目的。运行任务调用run() on the BuildLauncher目的。下面的例子演示了基本原理:

import org.gradle.tooling.BuildLauncher;
import org.gradle.tooling.GradleConnector;
import org.gradle.tooling.ProjectConnection;

import java.io.File;

public class ToolingAPI
{
    private static final String GRADLE_INSTALLATION = "C:\\Program Files\\Gradle";
    private static final String GRADLE_PROJECT_DIRECTORY = "path_to_root_of_a_gradle_project";
    private static final String GRADLE_TASK = "help";

    private GradleConnector connector;

    public ToolingAPI(String gradleInstallationDir, String projectDir)
    {
        connector = GradleConnector.newConnector();
        connector.useInstallation(new File(gradleInstallationDir));
        connector.forProjectDirectory(new File(projectDir));
    }

    public void executeTask(String... tasks)
    {
        ProjectConnection connection = connector.connect();
        BuildLauncher build = connection.newBuild();
        build.forTasks(tasks);

        build.run();
        connection.close();
    }

    public static void main(String[] args)
    {
        ToolingAPI toolingAPI = new ToolingAPI(GRADLE_INSTALLATION, GRADLE_PROJECT_DIRECTORY);
        toolingAPI.executeTask(GRADLE_TASK);
    }
}

这种方法的缺点是执行任务时 gradle 不知道位置。如果您在自定义任务中调用任何文件创建或修改方法,例如new File("somefile")将引发异常。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从java代码运行gradle任务? 的相关文章

  • (更好的方法)使用 Eclipse 和 XText 获取项目中的文件

    我正在编写一个 XText 编辑器 并进行一些语义突出显示 我正在解析的部分语言引用了文件 这些文件应该存在于项目中 我想根据这些文件是否位于正确的位置来突出显示 目前 我有一个非常丑陋的解决方案 但我确信有更好的方法 public voi
  • 使用 BlobOutputStream 在 Azure 中上传 blob

    我正在尝试直接从流上传 blob 因为我不知道我决定尝试的流的长度这个答案 https stackoverflow com a 24621538 3695939 这不起作用 即使它从流中读取并且不会抛出任何异常 内容也不会上传到我的容器 我
  • Spring Security 自定义身份验证 - AuthenticationProvider 与 UserDetailsS​​ervice

    据我所知 当您想要在 Spring Security 中进行自定义身份验证时 您可以实现自定义AuthenticationProvider或定制UserDetailsService Autowired public void configu
  • Java selenium - 如何在 TimeoutException 之后正确刷新网页?

    ChromeOptions options new ChromeOptions options addExtensions new File extension 6 2 5 0 crx ZenMate options addExtensio
  • Spring MVC - 自动查找验证器

    假设我有一个像这样的示例实体类 public class Address 和相应的验证器 Component public AddressValidator implements Validator Override public bool
  • Eclipse 与 IntelliJ 热部署

    我的应用程序配置 Tomcat 8 Spring Spring MVC Hibernate 在 Eclipse 中 我创建了 Tomcat 服务器 并将我的应用程序添加到资源中 JSP JS CSS 和 JAVA 类热部署的工作原理就是这样
  • 使用起始字符串和结束字符串从长字符串中提取子字符串?

    我有这个长字符串 它是一个长的连续字符串 Home address H NO 12 SECTOR 12 GAUTAM BUDH NAGAR NOIDA 121212 UTTAR PRADESH INDIA 911112121212 Last
  • 参考接口创建对象

    引用变量可以声明为类类型或接口类型 如果变量声明为接口类型 则它可以引用实现该接口的任何类的任何对象 根据上面的说法我做了一个理解上的代码 正如上面所说声明为接口类型 它可以引用实现该接口的任何类的任何对象 但在我的代码中显示display
  • 使用 Microsoft REST API - Java 将 Xbox-Live GamerTag 转换为 XUID

    我有一个 Java 应用程序 它需要能够获取用户输入的 Minecraft Bedrock Edition 玩家标签 并将其转换为给定帐户的 XUID 以便我可以将其存储起来以供稍后列入白名单和参考目的 我一直在浏览 Microsoft R
  • 在 Java 中生成 LaTeX 输出 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有用于从 Java 生成 LaTeX 输出的 Java 库 渲染乳胶 JLatex数学 https
  • SwingUtilities.invokeLater

    我的问题与SwingUtilities invokeLater 我应该什么时候使用它 每次需要更新 GUI 组件时都必须使用吗 它到底有什么作用 是否有替代方案 因为它听起来不直观并且添加了看似不必要的代码 Do I have to use
  • Netty Nio java 中的通信

    我想在 Netty nio 中创建一个具有两个客户端和一个服务器的通信系统 更具体地说 首先 我希望当两个客户端与服务器连接时从服务器发送消息 然后能够在两个客户端之间交换数据 我正在使用本示例提供的代码 https github com
  • 使用 gradle 部署 GAE 时出现奇怪的构建失败

    直到今天一切都运转良好 据我所知 没有改变任何东西 现在我明白了 C mypath gt gradle appengineDeploy gt Configure project WARNING You are a using release
  • Tomcat下的Spring CXF Soap Web服务:找不到服务

    我正在尝试使用 CXF 和 Spring 设置一个在 Tomcat 上运行的简单 CXF Web 服务 我有一个 Web 应用程序初始化程序来引导 CXF servlet public class WebAppInitializer ext
  • java charAt() 和startsWith() 哪个更快? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我的问题是 如果我想检查特定索引中字符串的一个字符 仅检查一个字符 哪种方法非常有效charAt or startsWith 我的意思是 据我所
  • 莫基托。验证方法参数是特定类

    我有一个方法 void putObject
  • Zookeeper 未启动,nohup 错误

    我已经下载了zookeeper 3 4 5 tar gz 解压后我将conf zoo cfg写为 tickTime 2000 dataDir var zookeeper clientPort 2181 现在我尝试通过 bin zkServe
  • Bipush 在 JVM 中如何工作?

    我知道 iload 接受整数 1 到 5 但是如何使用 bipush 指令扩展到更高的数字 特定整数如何与字节码一起存储 有几种不同的指令可用于推送整数常量 最小的是iconst 指令 这些只是一个字节 因为该值是在操作码本身中编码的 ic
  • ImageIO.read(...) - 非常慢,有更好的方法吗?

    我正在加载大量将在我的应用程序中使用的图标 我计划在服务器启动时从 jar 中加载所有这些 然而 由于数百张图像加起来刚刚超过 9MB 执行此任务仍然需要 30 秒多的时间 我现在正在一个单独的线程中执行此操作 但这让我想知道我是否在代码中
  • RetentionPolicy CLASS 与 RUNTIME

    两者之间有什么实际区别RetentionPolicy CLASS and RetentionPolicy RUNTIME 看起来两者都被记录到字节码中 并且无论如何都可以在运行时访问 无论如何 两者都可以在运行时访问 那不是那个javado

随机推荐

  • 设置初始标题单击 gwt 单元格表的默认排序顺序

    我有一个带有可排序列的 GWT CellTable 与开发人员指南示例非常相似 http code google com webtoolkit doc latest DevGuideUiCellTable html columnSortin
  • jQuery Mobile 获取当前页面

    我正在使用 jQuery Mobile 1 1 1 和 Apache Cordova 2 0 0 我希望我的应用程序在按下后退按钮时退出 但前提是当前页面的 ID feedZive 我正在使用以下代码来执行此操作 function onDe
  • iText 7.0.5 - 表单 - 添加大量带有表单字段的表时出现 NullPointerException

    我用了布鲁诺的例子 https developers itextpdf com examples form examples clone create fields table https developers itextpdf com e
  • 如何更改转置表以使其水平滚动?

    我正在制作一个产品比较表 它是一个具有垂直行的表格 左侧有一个标题 表格主体内的垂直行中有两个或多个产品描述 如果用户选择很多产品 它应该是水平滚动的 我使用过CSS这个答案 https stackoverflow com a 169194
  • React-Window无限调用RenderRow函数

    我用过react window在 UI 上呈现大型列表 不知道为什么当我滚动时它会无限地调用 RenderRow 函数 并且当我滚动时它无法渲染待处理的行 显示空白屏幕 谁能告诉我 我做错了什么 谢谢 有一个小东西漏掉了 就是必须发的款式R
  • Ruby on Rails:使用控制器、操作和参数获取路线

    我对 RoR 很陌生 我正在寻找一种获取给定控制器 操作和参数的路线的方法 类似于 url for 但没有域和协议 可以说我有 params controller gt controller action gt edit project i
  • DisplayMemberPath串联

    我正在尝试将两个值绑定到 ComboBox 显示值 但我不知道该怎么做 这种方法行不通 cboRegion DisplayMemberPath idregion description 有谁知道如何在 C 中做到这一点 不幸的是 这是不可能
  • 如何从 sfUser 获取 id?

    我正在使用 symfony 1 4 我使用 sfDoctrineGuardPlugin 作为身份验证工具 我想捕获用户的 ID 以便将其存储在我的表中 经过一番小研究 我想我必须使用这个表达方式 getUser gt getGuardUse
  • 如何检测我是否处于“控制台”模式

    我正在编写一个从浏览器运行的应用程序 然而 一些模型函数也是从 Yii2 控制台调用的 因此 我在尝试访问 GUI 中设置的变量时遇到错误 是否可以知道我处于哪种模式 是否自动设置了一些环境变量 或者我应该在控制台应用程序中设置一些会话变量
  • 如何使用 MVC5 和实体框架使用自定义属性更新 IdentityUser

    我正在使用内置的身份框架进行用户管理 并且想向 AspNetUsers 表添加一些自定义项 到目前为止 我遇到的每个问题的解决方案都会导致另一个问题 如果我对用户模型进行更改 例如 通过在 AspNetUsers 表中添加邮政编码属性和匹配
  • 加载密钥“(stdin)”时出错:格式无效 Gitlab CI

    这是我关于 gitlab ci 的 ssh 的 yaml 文件的一部分 eval ssh agent s echo SSH PRIVATE KEY tr d r ssh add gt dev null mkdir p ssh chmod 7
  • 使用 Python 将 XML 文档插入现有 XML

    给定这些 XML 文档 文件1
  • ASP.NET MVC 4.0 控制器和 MEF,如何将这两者结合在一起?

    我正在尝试使用 MEF 创建 ASP NET MVC 模块 虽然到目前为止我在不使用 MVC 的情况下使用 MEF 没有任何问题 但在导出控制器时我遇到了一些困难 我用这种方法作为例子http kennytordeur blogspot d
  • 如何快速识别 Snakemake 中的规则是否需要输入函数

    我正在关注其文档页面上的 Snakemake 教程 并且确实陷入了输入函数的概念https snakemake readthedocs io en stable tutorial advanced html step 3 input fun
  • 未定义符号:_ZdlPvm

    我在用阿波罗咖啡 https github com Russell91 apollocaffe and 重新检查 https github com Russell91 ReInspect Apollocaffe在 c 库中并且Reinspe
  • Ruby:反转哈希以保留非唯一值

    我有一个看起来像这样的哈希 a gt 1 2 3 b gt 4 5 6 c gt 3 4 5 d gt 7 2 3 我想要做的是使用包含它的所有键的数组对所有现有值进行哈希 例如把上面的变成这样 1 gt a 2 gt a d 3 gt a
  • 您可以从 iPhone 应用程序下载 PDF 格式的内容吗

    是否可以将 iPhone 应用程序中的特定屏幕下载为 PDF 格式 我检查了 iphone 开发者门户和很多其他地方 但找不到答案 我想做的就是单击一个按钮 然后将该屏幕下载为 pdf 并将其存储在某个位置 这可能吗 如果是这样 您会将其存
  • 您对 iAd 和 adSense 有何建议 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在考虑在我的应用程序中添加一个添加项 在 iAd 和 adSense 之间 您会向我推荐哪种广告计划
  • 使用未记录的“Application.Trim”并了解 VBA 智能感知建议

    当我用谷歌搜索时Trim 我发现它是一个Excel函数 也是一个VBA函数 在这两种情况下的 VBA 中 它只能与一个单元格一起使用 并且需要对多个单元格的范围进行循环 但是 我发现一些网页说明了使用Application Trim在没有循
  • 如何从java代码运行gradle任务?

    我需要从 java 方法将 gradle eclipse 任务运行到外部 gradle 项目 是否可以使用 Gradle Tooling API 来完成此操作 The 摇篮论坛 https discuss gradle org t exec