【问题标题】:Spring boot additional Crash CommandSpring Boot 额外的 Crash 命令
【发布时间】:2015-07-02 10:15:44
【问题描述】:

根据Spring boot documentation,在使用基于Crash的远程shell时可以定义额外的命令。

这些命令的默认位置是 classpath*:/commands/,classpath*:/crash/commands/

属性可用于覆盖默认位置,但在提供的示例中,自定义命令位于资源中。

在我看来,自定义命令(至少是 java 命令)不应位于资源中,而应位于 src/main/java 中。

在资源中定义自定义路径时效果很好,但是如何在 src/main/java 中定义自定义路径?暂时没找到办法!

【问题讨论】:

  • 我也想知道这一点,因为我想创建可以访问 spring 上下文的命令,当然还有我的类路径上的其他类。
  • @xenoterracide documentation 暂时并没有那么明确,但是这个声明对我来说是一个很好的起点def bean = context.attributes.beans["TheBean"];。我在 Java 中所做的是扩展 org.crsh.command.BaseCommand 并创建了我的方法 protected <T> T getSpringBean(Class<T> beanClass),它只是简单地执行 return ((BeanFactory) this.context.getAttributes().get("spring.beanfactory")).getBean(beanClass);

标签: java spring-boot spring-boot-actuator crash-shell


【解决方案1】:

如果它们在src/main/java 下,它们将被自动编译,这不是您需要的。我的解决方案是模拟那个目录作为一个resources文件夹,简而言之就是:

  1. 配置编译器插件以忽略该特定文件夹
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.3</version>
        <configuration>
            <source>${java.version}</source>
            <target>${java.version}</target>
            <excludes>
                <exclude>crash/commands/*</exclude>
            </excludes>
        </configuration>
    </plugin>
  1. 像复制目标目录中的任何常规资源一样复制文件
    <resource>
        <directory>src/main/java/crash/commands</directory>
        <targetPath>crash/commands</targetPath>
        <filtering>false</filtering>
    </resource>

次要更新和免责声明:

您可能已经知道,有几个在登录/注销时执行的闭包。至少对于我从 spring-boot 盲目继承的 v1.3.1,它会选择在类路径中找到的第一个 login.groovy。我的项目的工件与所有其他依赖项一起打包在 RPM 中。由于它的名称以r 开头,它位于默认值所在的crash.shell-1.3.1.jar 之后,所以我不得不做以下小技巧,让它选择我自己的脚本而不是默认脚本:

<!-- hack to make CRaSH pick up login.groovy from our jar instead of the default one -->
<finalName>0_${project.artifactId}-${project.version}</finalName>

【讨论】:

  • “它们会被自动编译,这不是你需要的。”为什么这是个问题?当操作需要 java 时,您会提到 groovy。
  • @xenoterracide 1) 嗯,如果我没记错的话,CRaSH 会自行查找并编译命令源。如果它们已经编译,它将找不到它们 2) 命令可以在 java 或 groovy 中实现,但是在登录/注销时执行的那些只是 groovy 闭包,而这两个是对 groovy。我还缺少其他东西吗?
  • 可能不是它只是真的不明显为什么 CRaSH 认为它必须自己编译东西。我的意思是我在运行时会做 groovy,但为什么它必须能够编译 Java,不过对于 CRaSH 开发人员来说可能是一个更好的问题。
  • @xenoterracide 原因之一是为了便于开发,因为您可以在运行时编写它们,它会立即获取您的更改。另一个可能是它做了某种仪器,但这只是一个假设,我还没有看一下来源。 P.S. 你可能已经注意到了,但如果你没有注意到,我也回复了你添加到关于 spring 访问问题的评论。干杯
  • 是的,我知道他们可能正在做一些事情,但所有这些事情都可以通过其他方式完成,而不是自己编译源代码。不得不做这些事情有点令人恼火。我并不是说他们不应该这样做,他们应该只是允许我们不这样做,我正在讨论提交错误,但我实际上没有直接的用例,我只是在演示技术作为 Spring Boot 演示的一部分。
【解决方案2】:

您可以尝试将您的命令放在src/main/resources/commands/

【讨论】:

  • 这就是我所做的,但问题是,如何指定位于 src/main/java 中的路径?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-24
  • 2020-09-02
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
  • 2018-12-18
  • 1970-01-01
相关资源
最近更新 更多