如何在 Groovy 2.3 中使用 @SourceURI 注释检索脚本文件的完整路径?

2024-05-05

我需要在运行时检索 Groovy 2.3 中脚本文件的完整路径。 实际上我遇到了与这里描述的问题相同的问题:在运行时获取 groovy 源文件的路径 https://stackoverflow.com/questions/11958185/get-path-to-groovy-source-file-at-runtime.

我的脚本可以从 GroovyShell 执行,也可以不执行。

我的脚本位于:

C:\users\myname\documents\scripts\myscript.groovy

=> 我只是想在运行时检索此路径。

如果我使用被接受的解决方案:

println new File(".").absolutePath

我得到的实际上是:

C:\groovy-2.3.7\.

这是 groovy 主文件夹。这是不正确的。 另一个建议的答案即:

URL scriptUrl = getClass().classLoader.resourceLoader.loadGroovySource(getClass().name)

仅当我的脚本位于类路径中,或者在 groovy 启动时使用 groovy-starter.conf 中的 load 指令加载该脚本时,该脚本才有效。否则返回 null。我可以使用这种方法,但它并不令人满意,因为它就像传递参数,这里的目标是用户能够从任何地方执行脚本而无需修改或配置。

我也红了这个关注这个问题的JIRA:JIRA-1642 http://jira.codehaus.org/browse/GROOVY-1642

解决方案似乎使用@SourceURI注释为此目的而创建的。问题是我无法让它发挥作用。我尝试执行以下所示的代码用法:源URI http://beta.groovy-lang.org/docs/latest/html/gapi/groovy/transform/SourceURI.html

@groovy.transform.SourceURI def sourceURI
assert sourceURI instanceof java.net.URI
path = sourceURI.toString()
println "path = $path"

我得到的是 (groovy 2.3.7) 不是路径而是源代码:

path = data:,@groovy.transform.SourceURI%20def%20sourceURI%0A%0A%20assert%20sourceURI%20instanceof%20java.net.URI%0Apath%20=%20sourceURI.toString()%0Aprintln%20%22path%20=%20$path%22

如何使用@SourceURI注释来检索脚本文件的路径?


我正在寻找与您相同的脚本路径信息。我注意到通过 shell 运行以下命令时:

@groovy.transform.SourceURI def sourceURI
assert sourceURI instanceof java.net.URI
sourceURI.properties.each { i -> 
    println i
}

我得到以下有用的结果(注意路径中的值):

rawAuthority=null
opaque=false
scheme=file
rawQuery=null
port=-1
rawUserInfo=null
path=/home/ttresans/GroovyScripts/TestSourceURI.groovy
class=class java.net.URI
absolute=true
schemeSpecificPart=/home/ttresans/GroovyScripts/TestSourceURI.groovy
rawPath=/home/ttresans/GroovyScripts/TestSourceURI.groovy
query=null
fragment=null
host=null
authority=null
rawFragment=null
userInfo=null
rawSchemeSpecificPart=/home/ttresans/GroovyScripts/TestSourceURI.groovy

但如果我将相同的内容粘贴到 GroovyConsole 中,我会得到以下内容:

rawAuthority=null
opaque=true
scheme=data
rawQuery=null
port=-1
rawUserInfo=null
path=null
class=class java.net.URI
absolute=true
schemeSpecificPart=,@groovy.transform.SourceURI def sourceURI
assert sourceURI instanceof java.net.URI
sourceURI.properties.each { i -> 
    println i
}

rawPath=null
query=null
fragment=null
host=null
authority=null
rawFragment=null
userInfo=null
rawSchemeSpecificPart=,@groovy.transform.SourceURI%20def%20sourceURI%0Aassert%20sourceURI%20instanceof%20java.net.URI%0AsourceURI.properties.each%20%7B%20i%20-%3E%20%0A%20%20%20%20println%20i%0A%7D%0A

这是 Ubuntu 上的 Groovy 2.3.9。

所以看起来 GroovyConsole 的启动可能是一个问题,但注释实际上确实产生了所需的路径。

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

如何在 Groovy 2.3 中使用 @SourceURI 注释检索脚本文件的完整路径? 的相关文章

  • Eclipse 插件和 Maven 依赖项中存在的“groovy-all”jar 之间的兼容性问题

    在我的 POM 中 有一个依赖项 spock core 1 0 groovy 2 3 它将 groovy all 2 3 10 添加到我的项目中 而且 我的 eclipse groovy 插件包含 groovy all 2 3 7 jar
  • 如何简单地解析没有指定年份的日期?

    我有一个工具 它似乎可以给我日期 但没有指定我需要转换的年份 并且我正在使用 Java 来完成任务 实际上是 Groovy 但在本例中足够接近 示例日期是 13 Dec 12 00 00 它应该指的是 12 13 2011 因为年份未指定
  • Soapui 添加节点到请求 (Groovy)

    我遇到了问题 所以我得到了这样的 WSDL
  • 如何在Groovy中执行shell命令并获取返回码$?

    我无法从 Groovy 中执行 shell 脚本获得返回代码 不是输出或错误 对于我尝试过的所有方法 它要么要求我转义 要么只是打印 而不是给我 1 或 0 groovy 75 美元符号后的字符串主体字符非法 解决方案 要么转义文字美元符号
  • Grails 2.4.3:使用 REST 服务

    如何在 Grails 2 4 3 中使用 RESTful Web 服务 我还需要使用基本身份验证 你可能认为这个问题已经有了一个很好的答案 但我真的很难找到一个 许多答案都向我指出了 Grails Rest 插件的方向 我已经尝试过但无法为
  • 如何循环遍历列表并删除 groovy 中的项目?

    我试图弄清楚如何从循环内的 groovy 列表中删除项目 static main args def list1 1 2 3 4 for num in list1 if num 2 list1 remove num println list1
  • IntelliJ + Groovy + Spock:没有为模块定义 Groovy 库

    我一直在尝试在 IntelliJ IDEA 中创建一个带有 Spock 测试的 Groovy 项目 以下是我遵循的步骤 创建 Groovy 项目并添加 Maven 支持 添加了 Spock 依赖项和插件 我使用的 POM 与此非常相似 ht
  • 在groovy中将变量标记为final是否有意义?

    我想知道变量如何标记为final由 Groovy 解释 在 1 8 0 1 8 1 中 我知道这在 Java 中是有意义的 并且可以提高性能 当然还有助于避免愚蠢的错误 我想了解如果final可以帮助java编译器优化用Groovy编写的程
  • Groovy 语言书籍/教程 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Groovy == 运算符

    到目前为止 我的理解是 是一个运算符重载 equals 然而我最近发现 new Integer 1 new Long 1 returns true whereas new Integer 1 equals new Long 1 return
  • Groovy 中的 __LINE__ 功能

    可以通过以下方式获取当前行号 LINE 在 Ruby 或 Perl 中 例如 print filename FILE line LINE Groovy 中有同样的功能吗 不能直接获取 但您可以通过异常 或可抛出 堆栈跟踪来获取它 例如 St
  • groovy 中具有默认值的命名参数

    是否可以在 groovy 中使用具有默认值的命名参数 我的计划是创建一种对象工厂 可以在没有任何参数的情况下调用它 以获得具有默认值的对象 另外 我需要显式设置对象的任何参数的功能 例如 我相信这可以通过 Python 关键字参数实现 我现
  • 带有 Grails 的 AOP

    我想在我的 Grails 项目中创建自定义日志记录注释 My code class MyService AuditLog def method1 println method1 called method2 AuditLog def met
  • GPars 报告大量异步函数的状态并等待完成

    我有一个解析器 在收集一行数据后 我想触发一个 aync 函数并让它处理该行 同时主线程继续运行并获取下一行 我看过这个帖子 在 Groovy 中如何同时执行两个任务并等待结果 https stackoverflow com questio
  • 遍历多行字符串

    我得到一些数据 def data some useless text n even more n finally interesting text 我怎样才能得到其中 有趣的部分 所以基本上所有行都不是以 开头的 Groovy 的一种选择是
  • Groovy 与 Grape 和 AntBuilder 类加载器问题

    我想使用 groovy 编写一个小 ftp 脚本 并找到了这篇文章http www hhhhq org blog 2009 05 01 ftp using groovy and ant http www hhhhq org blog 200
  • 对于基于 Play 2.0 的 Java 应用程序,我可以使用 groovy 模板代替 scala 吗?

    我是 Play 2 0 新手 我很难理解用于创建视图的 scala 模板 我可以切换回 groovy 因为它存在于早期版本的 Play 框架中 例如 播放 1 2 播放 1 2 4 是的 有一个可用于 groovy 的模块 https gi
  • Grails 操作被调用两次。帮助!

    我正在编写一个 grails 应用程序并遇到一个奇怪的问题 单击页面上的提交按钮时 关联的操作会快速连续调用两次 这会导致一切都严重破坏 以前有其他人见过这个问题吗 下面是我的代码 从普惠制页面
  • 如何将任务添加到 gradle 中的主要“构建”任务

    当我尝试使用以下代码将任务添加到主构建任务时 rootProject tasks getByName build dependsOn mytask 当我跑步时它抱怨gradle w build输出 Where Build file line
  • 修改String字段的getter的返回值

    假设我的应用程序中有一些类似于域类的类 其中包含一些 Long Double Date 和 String 字段 这些类使用一些公共字段和一些公共方法扩展了基类 每当我访问 String 类字段 通过 getter 时 我想对返回的值进行一些

随机推荐