2014-10-05 18 views
7

Próbuję dodać nowe niestandardowe polecenie do powłoki zdalnej rozruchu wiosennego bez powodzenia. W dokumentacji jest dostępny tylko groovy przykład, ale ja lubię używać Java, aby utworzyć nowe polecenie.rozruchowa zdalna powłoka niestandardowa komenda

http://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-remote-shell.html ja również sprawdzić dokumentację awarii: http://www.crashub.org/1.3/reference.html#_java_commands

Kładę klasę pod poleceń pakietu i crash.commands ale nie widzę mojego nowego polecenia, jeśli mogę podłączyć do obudowy poprzez ssh i typu pomoc. Masz pojęcie, co robię źle?

Oto mój kod 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

Rozszerzenie powłoki Spring Boot traktuje polecenia jako skrypty Groovy, a nie jako fasola Spring. Twój kod Java będzie na ogół przydatny jako Groovy; po prostu dołącz źródło zamiast skompilowanego pliku '.class'. – chrylis

Odpowiedz

1

umieścić klasę w domyślnym pakietem (tj pominąć oświadczenie pakiet) i umieścić źródło Java dla klasy w src/main/zasobów/poleceń. Spring/Crash skompiluje kod Java przy pierwszym uruchomieniu polecenia. Ponadto, jeśli klasa implementuje jednego polecenia nazwa metoda powinna być „głównym” w przeciwnym razie użytkownicy muszą wpisać:

> hello test 

też nie potrzebują @Component adnotacji na klasy, ponieważ nie udało się sprężyna fasola.

+1

Jeśli klasa poleceń znajduje się w domyślnym pakiecie, zostanie ona pominięta przez 'componentScan' Springa. Jak mogę korzystać z usług takich jak usługi, Spring Data i moje fasolki? – ex3v

+2

Udostępniono instancję Spring's BeanFactory, do której można uzyskać dostęp za pomocą skryptów poleceń w celu uzyskania usług, itp. Wystąpień. Coś takiego jak: 'Fabryka fasoli = kontekst.atrybuty ['spring.beanfactory'] Usługa MyService = factory.getBean (MyService.class)' –

+0

Dzięki za odpowiedź! Czy możesz mi również powiedzieć, jak uzyskać kontekst w tym przypadku? – ex3v

2

Jeśli klasa jest nazywany „cześć”, umieścić go w

resources/crash/commands/hello/hello.java 

uwzględniając oświadczenie pakiet nie ma znaczenia. Nie musisz wkładać niczego do src, po prostu posiadasz te wewnętrzne zasoby.

@Component nie jest wymagany.

Ta klasa jest kompilowana podczas uruchamiania. Patrz:

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

W związku z tym wszelkie wymagania dotyczące wtryskiwania zależności należy odpowiednio uwzględnić podczas inicjacji.

+1

Dzięki! :) wow –

+0

Nie ma za co! –