Eu chamo o método para compilar e em seguida o método para gerar o JAR, mas se houver muitos arquivos para compilar, quando cria o JAR ficam faltando alguns arquivos, pois não dá tempo de compilar todos.
Não sei como verificar se todos os arquivos já foram compilados antes de chamar o método para gerar o JAR.
O JAR criado só é concluído depois que eu fecho o meu programa.
Eu não sei porque isso acontece!
Já tentei usar o javax.tools e funcionou, mas como eu disponibilizo o meu software para download não gostaria que ele ficasse dependente de libs, porq fica mais pesado para baixar!
Hum… certo. Então só tem um probleminha, que é o de você ter feito isto:
for (File f : files) {
cmd.exec("javac.exe "
+ f.getAbsolutePath());
}
Obviamente, há dois problemas aqui.
a) Você está supondo que o javac.exe está no path do cidadão que vai usar o seu pacote (acho que está OK)
b) Você não está esperando a execução do javac.exe para passaro ao comando depois do for. É por isso que você reclama que de vez em quando os arquivos não estão completamente compilados.
Provavelmente você vai ter de dar uma olhadinha naquele famoso artigo:
Casualmente, o exemplo que ele dá é com o javac.exe mesmo
De qualquer maneira, a presença de javax.tools não depende exatamente de um download mas sim de
a) o fulano ter o JDK instalado, e
b) a versão do Java ser 6.0 ou superior.
Métodos sincronizados não resolvem o problema dela.
O problema dela é que ela não está esperando o javac.exe terminar, e isso não se resolve com um “synchronized”.
Eu chamo o método para compilar e em seguida o método para gerar o JAR, mas se houver muitos arquivos para compilar, quando cria o JAR ficam faltando alguns arquivos, pois não dá tempo de compilar todos.
Não sei como verificar se todos os arquivos já foram compilados antes de chamar o método para gerar o JAR.
O JAR criado só é concluído depois que eu fecho o meu programa.
Eu não sei porque isso acontece!
[/quote]
Olá, você pode fazer assim:
public boolean makeClass() {
try {
Runtime cmd = Runtime.getRuntime();
File[] files = new File("C:\\Users\\Andreia\\Documents\\novoPrograma1"
).listFiles();
for (File f : files) {
cmd.exec("javac.exe "
+ f.getAbsolutePath());
}
return true;
} catch (IOException ex) {
ex.printStackTrace();
}
}
public void makeJarFile() {
try {
Runtime cmd = Runtime.getRuntime();
File[] files = new File("C:\\Users\\Andreia\\Documents\\novoPrograma1"
).listFiles();
for (File f : files) {
cmd.exec("javac.exe "
+ f.getAbsolutePath());
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
if (makeClass) {
makeJarFile();
}
Godzilla, você não enxergou ainda o problema dela. O problema da Andréa é realmente não esperar o javac.exe acabar. Não adianta ir metendo um monte de try/catch que não é isso que vai resolver (e pior, seu código nem compila porque não tem um “return false” depois do try).
entanglement, eu li o artigo mais ou menos. Não sei inglês e traduzi no google Tradutor, mas não entendi muito bem.
Ainda não sei como fazer para saber se o javac.exe já terminou de executar, no caso de compilar os arquivos.
E por que quando eu gero o .jar ele não termina de criar o JAR até que eu feche o meu programa?
Se você quiser uma outra solução mais simples, recomendo criar um único método
que executa os dois comandos sequencialmente criando um array com os dois comandos.
[quote=entanglement]De qualquer maneira, a presença de javax.tools não depende exatamente de um download mas sim de
a) o fulano ter o JDK instalado, e
b) a versão do Java ser 6.0 ou superior. [/quote]
entanglement, eu me confundi. Eu tava me referindo a lib tools.jar.
Mas javax.tools eu usei também, mas dava erro na hora de compilar os arquivos dentro do pacote!
Não consegui achar a solução e passei a usar javax.exec!
Olá, me diga uma coisa, qual a logica de compilar um monte de classes e jerar um jar, cujo precisa de todas as classes compiladas. Releia novamente as duas questões que ela coloca acima.
1.: Isto acontece por que você esta chamando os dois metodos um em seguida do outro, sem aguardar o primeiro que compila as classes terminar o seu trabalho. E com isso claro que o mesmo nao consegue colocar todas as classes necessarias dentro do arquivo .jar, a [u]SUGESTÃO[/u], veja [quote]entanglement[/quote], foi apenas uma sugestão, que éla deveria aguardar o primeiro metodo terminar o seu trabalho e só depois disso chamar o outro, o que eu sugestionei foi que ela chama-se um metodo que retorna um true ou false, para que o segundo metodo so deve ser chamado quando o primeiro terminar o serviço, e se seu retorno fosse verdadeiro.
Gostaria de pedir desculpas por ter colocado uma sugestão com o código errado, pois somente peguei o codigo que já existia e fiz uma sugestão para clarear a ideia. Fui infeliz na ajuda, caso o conteudo que postei não for ajudar, por favor desconsiderem as postagens.