2014-10-05 65 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