2014-10-05 9 views
7

Cerco di aggiungere un nuovo comando personalizzato alla shell remota di avvio a molla senza successo. Nella documentazione è disponibile solo un esempio groovy, ma mi piace usare Java per creare un nuovo comando.comando di avvio a molla shell remota custom

http://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-remote-shell.html Ho anche controllare la documentazione Crash: http://www.crashub.org/1.3/reference.html#_java_commands

ho messo la mia classe sotto comandi del pacchetto e crash.commands, ma non vedo il mio nuovo comando se mi collego alla shell tramite SSH e il tipo di aiuto. Qualche idea su cosa sto facendo male?

Ecco il mio codice 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

L'estensione di shell Spring Boot tratta i comandi come script Groovy, non come bean Spring. Il tuo codice Java sarà generalmente utilizzabile come Groovy; includi semplicemente la fonte invece di un file '.class' compilato. – chrylis

risposta

1

Mettere la classe nel pacchetto di default (cioè omettere la dichiarazione di pacchetto) e mettere la sorgente di Java per la classe in src/main/risorse/comandi. Spring/Crash compila il codice Java la prima volta che invochi il comando. Inoltre, se la classe implementa un singolo comando il nome del metodo dovrebbe essere 'main' altrimenti gli utenti devono digitare:

> hello test 

Inoltre non hanno bisogno l'annotazione @Component sulla classe in quanto non è una primavera gestito fagiolo.

+1

Se la classe di comando si trova nel pacchetto predefinito, verrà omessa da 'componentScan' di Spring. Come posso usare cose come servizi, Spring Data e miei fagioli allora? – ex3v

+2

Viene resa disponibile un'istanza di Spring's BeanFactory che è possibile accedere agli script di comando per ottenere istanze di servizio, ecc. Qualcosa del tipo: 'BeanFactory factory = context.attributes ['spring.beanfactory'] Servizio MyService = factory.getBean (MyService.class)' –

+0

Grazie per la risposta! Potresti anche dirmi come ottenere un contesto in questo caso? – ex3v

2

Se la classe si chiama 'ciao', mise in

resources/crash/commands/hello/hello.java 

Avere una dichiarazione package non importa. Non devi mettere nulla dentro src, basta avere queste risorse interne.

@Component non richiesto.

Questa classe viene compilata durante il runtime. Vedi:

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

Pertanto, è necessario considerare i requisiti di iniezione delle dipendenze di conseguenza con l'inizializzazione pigra.

+1

Grazie !! :) wow –

+0

Prego! –

Problemi correlati