Como manter o console aberto depois de executar um arquivo em lotes?

2

Quando executo o arquivo startup.bat do Apache Tomcat manualmente, o console do cmd permanece aberto; quando executo o mesmo no código java, o console é fechado. (Estou tentando automatizar alguns processos no meu projeto). Para Windows, parece que quando o Tomcat é executado como um aplicativo, o console deve permanecer aberto após a execução do .bat.

Como posso fazer isso acontecer para o meu código java? obrigado

Aprendiz
fonte
1
cmd /k batchfiledeixará o cmd aberto, mas provavelmente não é o que você deseja. Eu acho que é um problema com caminhos / diretório em execução, causando a falha na inicialização (pois não é possível executar comandos no lote). Também gostaria de sugerir para alterar o título para explicar melhor o seu específico questão
wmz
você poderia detalhar o que você quer dizer com 'manualmente'? Como exatamente você executa esse arquivo em lotes?
Wmz

Respostas:

1

Startup.batdepende de duas variáveis ​​env: CATALINA_HOME e JRE_HOME (ou JAVA_HOME).
Você deve ter JRE_HOME ou JAVA_HOME definido, caso contrário, não poderá executar a inicialização clicando duas vezes.
Isso nos deixa com CATALINA_HOME. O script de inicialização tentará adivinhar se não estiver definido, mas isso funcionará apenas se for executado a partir do diretório atual (ou do pai para ser mais preciso). Se você tentar executá-lo em outro diretório e o CATALINA_HOME não estiver definido, ocorrerá uma falha (com uma mensagem sobre isso).
Se esse for o seu problema, você verá uma mensagem semelhante na parte superior da janela do cmd:

A variável de ambiente CATALINA_HOME não está definida corretamente Esta variável de ambiente é necessária para executar este programa

Outro problema que você pode encontrar é quando seu caminho contém espaços. Parece que o seu não, mas ainda pode ser útil para outras pessoas, por isso vou incluir esta informação.
Quando seu comando inclui espaços, você precisa citar seu startcomando, certo? Isso deve fazer: "cmd.exe /c start \"my path to tomcat bin/startup.bat\""
Errado. Você acaba olhando para a janela de comando intitulada meu caminho para tomcat bin / startup.bat
start leva o primeiro argumento citado como título ... que legal. O formulário correto é:
"cmd.exe /c start \"\" \"my path to tomcat bin/startup.bat\""

Mas espere

esses dois problemas realmente impedirão a exibição da janela do Tomcat - você diz que ela fecha , então ela inicia e depois morre. Hmm ... isso é mais provável porque já existe um processo escutando na porta 8080 . Talvez o seu IDE java inicie o Tomcat? Ou inicia outro servidor ouvindo no 8080? Se essa é a causa, você deve ver uma linha semelhante no log do Tomcat (elas estão armazenadas CATALINA_HOME/logs):

java.net.BindException: Endereço já em uso: JVM_Bind

Se esse for o seu problema, você precisará interromper a primeira instância ou reconfigurar os processos do servidor para que cada um escute em uma porta diferente.

Nota: Eu usei o seguinte para iniciar o Tomcat a partir do java, funciona bem para mim:

    Runtime r=Runtime.getRuntime();
    r.exec("cmd.exe /c start startup.bat",          //path to executable
            null,                                   // env vars, null means pass parent env
            new File("my path to tomcat/bin")); // working directory 
wmz
fonte
Fico feliz em saber, você poderia aceitar a resposta então (marque ao lado das setas de votação)?
Wmz
0

Verifique as propriedades do arquivo .bat (clique com o botão direito do mouse), deve haver a opção de manter o console aberto. Última guia, tanto quanto me lembro.

kenorb
fonte
Obrigado por suas respostas, @wmz Eu tentei isso e não funcionou; @kenorb essa opção não estiver disponível, usando o Windows 7.
Learner
@ wmz Quero dizer, basta clicar duas vezes em startup.bat. Quando eu coloco o comando String = "cmd / C start C: /Users/~/startup.bat" (~ é o resto do caminho para o arquivo) em java, ele é executado, mas o console é fechado posteriormente. Preciso que ele permaneça aberto para que o servidor Tomcat continue em execução. Desculpe por não estar claro antes.
Learner
@Learner Eu não estou notificado de comentários deste post, mesmo se você incluiu meu nome ... De qualquer forma, eu postei uma resposta para você
wmz
0

Vá para a sua tomcat/binpasta. Edite o startup.batarquivo e comente a última mas uma linha que diz

call "%EXECUTABLE%" run >..\logs\OutputFile.log 2>&1 start %CMD_LINE_ARGS% run >..\logs\OutputFile.log 2>&1

Comente usando REMno início.

rem call "%EXECUTABLE%" run >..\logs\OutputFile.log 2>&1 start %CMD_LINE_ARGS% run >..\logs\OutputFile.log 2>&1 

o console permanecerá aberto. Se essa linha for comentada, significa que é necessário fechar o console e gravar a saída em algum arquivo de log externo.

user1005218
fonte
Tem certeza de que sua última frase está correta? E não afirmando exatamente o oposto?
zx485 6/03