2014-10-05 57 views
7

我尝试向spring启动远程shell添加一个新的自定义命令,但没有成功。 在文档中只有一个可用的例子,但我喜欢使用Java创建一个新的命令。弹簧启动远程shell自定义命令

http://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-remote-shell.html 我还要检查崩溃文档:http://www.crashub.org/1.3/reference.html#_java_commands

我把我的类包下的命令和crash.commands,但我没有看到我的新命令,如果我通过ssh和键入help连接到外壳。任何想法我做错了什么?

这是我的Java代码:

package commands; 

import org.crsh.cli.Command; 
import org.crsh.cli.Usage; 
import org.crsh.command.BaseCommand; 
import org.springframework.stereotype.Component; 

@Component 
public class hello extends BaseCommand { 

    @Command 
    @Usage("Say Hello") 
    public String test() { 
    return "HELLO"; 
    } 
} 
+3

Spring Boot shell扩展将命令视为Groovy脚本,而不是Spring bean。无论如何,您的Java代码通常可以用作Groovy;只需包含源代码,而不是编译的'.class'文件。 – chrylis 2014-10-05 10:00:12

回答

1

把类的默认包(即省略了包语句),并把Java源代码中的src/main /资源/命令类。第一次调用命令时,Spring/Crash会编译Java代码。此外,如果类实现一个命令的方法名称应该是“主”,否则用户必须键入:

> hello test 

你也不需要在类的@Component注解,因为它不是管理的春天豆。

+1

如果命令类位于默认包中,它将被Spring的'componentScan'省略。我如何才能使用服务,Spring Data和我的bean呢? – ex3v 2015-01-12 10:42:58

+2

Spring的BeanFactory的一个实例可用于访问命令脚本以获取服务等实例。例如: 'BeanFactory factory = context.attributes ['spring.beanfactory'] MyService service = factory.getBean(MyService.class)' – 2015-01-12 18:15:16

+0

感谢您的回答!你能否告诉我在这种情况下如何获得背景? – ex3v 2015-01-13 08:06:22

2

如果你的类被称为“你好”,把它放在

resources/crash/commands/hello/hello.java 

有一个包语句没有关系。 你不必把任何东西放在src中,只需要这个内部资源。

@Component不是必需的。

该类在运行时编译。参见:

org.crsh.lang.impl.java.JavaCompiler#compileCommand 

因此,任何依赖注入需求都需要相应地考虑延迟初始化。

+1

谢谢! :)哇! – 2015-06-30 10:45:47

+0

不客气! – 2015-07-05 16:43:39