Trabalhando com ProcessBuilder e Process

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

  • 1 - set a variavel de ambiente
    set cvsroot=c:\cvsroot

  • 2 - faço o login
    cvs login

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