Estou usando o compilador javac para compilar arquivos java no meu projeto. Os arquivos são distribuídos ao longo de vários pacotes como esta: com.vistas.util
, com.vistas.converter
, com.vistas.LineHelper
, com.current.mdcontect
.
Cada um desses pacotes possui vários arquivos java. Estou usando javac assim:
javac com/vistas/util/*.java com/vistas/converter/*.java
com.vistas.LineHelper/*.java com/current/mdcontect/*.java
(em uma linha)
Em vez de fornecer tantos caminhos, como posso pedir ao compilador para compilar recursivamente todos os arquivos java do diretório com pai?
Respostas:
Eu também sugeriria usar algum tipo de ferramenta de construção ( Ant ou Maven , Ant já é sugerido e é mais fácil começar) ou um IDE que lida com a compilação (o Eclipse usa compilação incremental com estratégia de reconciliação, e você nem precisa pressione qualquer botão "Compilar" ).
Usando Javac
Se você precisar tentar algo para um projeto maior e não tiver nenhuma ferramenta de construção adequada por perto, sempre poderá usar um pequeno truque que
javac
oferece: os nomes de classe a serem compilados podem ser especificados em um arquivo. Você simplesmente precisa passar o nome do arquivo parajavac
com o@
prefixo.Se você pode criar uma lista de todos os
*.java
arquivos em seu projeto, é fácil:sources.txt
arquivo sempre que criar uma nova fonte ou renomear um arquivo existente, o que é uma tarefa fácil de esquecer (portanto sujeita a erros) e cansativa.Usando uma ferramenta de construção
A longo prazo, é melhor usar uma ferramenta projetada para criar software.
Usando Ant
Se você criar um
build.xml
arquivo simples que descreve como criar o software:você pode compilar o software inteiro executando o seguinte comando:
Usando o Maven
O Maven não é tão trivial de configurar e trabalhar, mas aprendê-lo paga bem. Aqui está um ótimo tutorial para iniciar um projeto em 5 minutos .
Usando um IDE
Agora, o que poderia aumentar sua produtividade de desenvolvimento. Existem algumas alternativas de código aberto (como Eclipse e NetBeans , prefiro a primeira) e até mesmo comerciais (como IntelliJ ) que são bastante populares e poderosas.
Eles podem gerenciar a construção do projeto em segundo plano, para que você não precise lidar com todo o material da linha de comando. No entanto, sempre é útil se você souber o que realmente acontece em segundo plano, para que possa caçar erros ocasionais como um
ClassNotFoundException
.Uma nota adicional
Para projetos maiores, é sempre recomendável usar um IDE e uma ferramenta de construção. O primeiro aumenta sua produtividade, enquanto o último possibilita o uso de IDEs diferentes no projeto (por exemplo, o Maven pode gerar descritores de projeto do Eclipse com um simples
mvn eclipse:eclipse
comando). Além disso, é fácil apresentar um projeto que pode ser testado / construído com um comando de linha única para novos colegas e em um servidor de integração contínua, por exemplo. Pedaco de bolo :-)fonte
javac
, seria melhor especificar um diretório de saída.find -name "*.java" > sources.txt && javac -d bin @sources.txt
. Caso contrário, os arquivos * .class são salvos no diretório em que as fontes estão.javac
, o conceito deCLASSPATH
como executar códigojava
, como lidar com pacotes, que deve ser a pasta raiz para execução etc. geralmente não são claros. Assim, eu omiti o dir de saída. Enfim, obrigado pela sugestão!find
comando é:find . -name "*.java" > sources.txt
(observe o.
)Meio brutal, mas funciona como o inferno. (Use apenas em pequenos programas, não é absolutamente eficiente)
fonte
find ... -print0
exargs -0 ...
em vez para não quebrar em espaços em nomes de arquivosSe o seu shell o suportar, algo assim funcionaria?
Se o seu shell não suportar
**
, então talvezfunciona (para todos os pacotes com 3 componentes - adapte-se para mais ou menos).
fonte
No caso usual em que você deseja compilar todo o seu projeto, você pode simplesmente fornecer o javac com sua classe principal e deixá-lo compilar todas as dependências necessárias:
javac -sourcepath . path/to/Main.java
fonte
Main.java
, o que provavelmente não aconteceria depois de criar seu segundo arquivo, nada mais será compilado.javac -cp "jar_path/*" $(find . -name '*.java')
(Prefiro não usar xargs porque ele pode ser dividido e executado javac várias vezes, cada um com um subconjunto de arquivos java, alguns dos quais podem importar outros não especificados na mesma linha de comando javac)
Se você tem um ponto de entrada App.java, o caminho do freaker com -sourcepath é melhor. Ele compila todos os outros arquivos java necessários, seguindo as dependências de importação. por exemplo:
javac -cp "jar_path/*" -sourcepath src/ src/com/companyname/modulename/App.java
Você também pode especificar um dir classe-arquivo de destino:
-d target/
.fonte
Aconselho você a aprender a usar o ant , que é muito adequado para esta tarefa e é muito fácil de entender e bem documentado.
Você apenas teria que definir um destino como este no arquivo build.xml:
fonte
Estou apenas usando make com um makefile simples que se parece com isso:
Ele compila as fontes uma por vez e apenas recompila se necessário.
fonte
O comando javac não segue um processo de compilação recursiva; portanto, você deve especificar cada diretório ao executar o comando ou fornecer um arquivo de texto com os diretórios que deseja incluir:
fonte
Eu tenho usado isso em um projeto Xcode JNI para construir recursivamente minhas classes de teste:
fonte