Olá amigos,
Não conheço muito bem o funcionamendo das classes ProcessBuilder e Process, mas queria fazer o seguinte:
Estou desenvolvendo um pequeno modelo de gerenciamento de codigo fonte utilizando o CVSNT, e tenho que fazer com que o meu software “converse” com o CVSNT, a unica forma que emcontrei é passando comandos para o Prompt Command.
Não sei se existem classes prontas que interajam com o servidor CVS.
Então Tenho que passar os comando login, diff, commit, entre outros… pelo prompt.
Queria saber se tem como eu passar varios comando para o prompt sem que o processo seja fechado:
Explicando melhor:
eu consegui passar o login, mais queria que o processo continuase aberto para que eu pudesse dar mais comando.
exemplo de algum comands:
c:[b]set cvsroot=\cvsroot[/b]
c:[b]cvs loing[/b]
Nota: esses comandos deve ser passado em sequencia. Se for passado um em cada processo não funciona.
pois deve haver a autenticação com o cvs e depois dar os comando que quizer.
Seria algo do tipo que estou querendo fazer
Runtime.getRuntime().exec(“set cvsroot=\cvsroot”);
Runtime.getRuntime().exec(“cvs login”);
o problema é que isso nao funciona pois, no prompt de comando, sempre apos uma intrução tenque que se dar um ENTER para que a instrução seja executa, e nao sei como passar um ENTRER pelo Runtime.getRuntime().exec();. e tambem existe o problema de o processo nao ser fechado,
pois todas a instruções deve ser executas em um só.
Sei que isso pode ser resolvido criando um .bat mais nao queria ficar preso há arquivos, pois futuramente posso mudar de SO.
E tambem eu tenho que pegar as respostas do prompt, pois consideremos que um login nao foi efetuado, então tenho que mostrar uma mensagem para o usuário que nao foi possivel realizar o login.
Bem, desde já agradeço a todos.
Peraí, vamos esclarecer uma coisa.
O Process é um processo, um programa que está executando.
Você tem acesso aos fluxos de entrada e de saída desse processo através do getOutputStream() e do getInputStream().
O Process não é o prompt. Por isso, vc não precisa dar enter. O prompt é outro programa, que te dá uma interface baseada em texto, onde vc pode disparar programas e ver o resultado.
Aliás, vc até poderia usar os streams para controlar o prompt de comando mesmo (daí vc dá exec no processo do prompt, não do seu controle de versão). Um dos streams do Process te dará o que veio na tela, e através do outro Stream vc controla a entrada do teclado.
Outro problema que você encontrou é que há um comando (set cvsroot = c:\cvsroot) que é um comando do interpretador de comandos e que na verdade seta uma variável de ambiente (environment variable) para o comando a seguir. O jeito correto de trabalhar seria chamar um dos overloads de “Runtime.exec” que aceita um array de strings contendo as variáveis de ambiente que você deseja que sejam usadas pelo programa:
Runtime.exec
O ProcessBuilder também tem métodos que fazer o equivalente ao seu set.
Basta fazer:
[code]//Define o processo como cvs login
ProcessBuilder pb = new ProcessBuilder(“cvs login”);
//Define a variável de ambiente cvsroot, usada por seu processo.
pb.environment().put(“cvsroot”, “\cvsroot”);
//Inicia o processo.
Process process = pb.start()[/code]
Em ambos os casos (tando com Runtime, quanto com o ProcessBuilder), se vc for executar um novo comando, você precisará definir todas as variáveis de ambiente novamente.
Certo amigos, agora ficou mais claro do que esta acontecendo, mais então o que devo fazer para dar os comando do CVS pelo codigo Java e pegar a mensagem de retorno??
para que os comando sejam executados sempre tenho que digitar da seguinte forma
apos logado
- 3 - vejo o status do cvs
cvs status
##os comando deve ser sempre executados da ordem que estão dispostos(1 - 2 - 3)
como eu coloco eles no java