Pergunta

Say Eu tenho minhas fontes na minha src / árvore (e possivelmente no meu teste / tree). Digamos que eu gostaria de compilar apenas parte daquela árvore. As razões pelas quais eu poderia querer fazer isso são várias. Apenas como exemplo, eu poderia querer criar o menor frasco possível (sem incluir certas classes), ou eu poderia querer o melhor tempo de compilação para o que estou compilando. Eu absolutamente quero compilar todas as dependências, embora!

Isto pode ser facilmente alcançado a partir da linha de comando com:

javac -d build/ -cp whatever -sourcepath src src/path/to/MyClass.java

Agora, como você pode fazer isso com formiga? O javac formiga compila tarefa tudo :

O diretório de origem e destino será recursivamente digitalizados para Java arquivos de origem para compilar.

Pode-se usar os parâmetros excludes e includes, mas eles são problemáticos para esta finalidade. Na verdade, parece que a pessoa tem que explicitamente configuração todo o includes (não automática de pesquisa de dependência), e ainda pior que exclui tem prioridade sobre inclui :

Quando ambos inclusão e exclusão são utilizados, apenas os arquivos / diretórios que corresponder a pelo menos um dos incluem padrões e não correspondem qualquer do excluir padrões são usados.

Assim, você não pode usar

<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath"
            excludes="**/*.java" includes="src/path/to/MyClass.java" />  

Porque ele não vai nada de compilação: - (

Existe alguma maneira de alcançar esse simples javac linha de comando com formiga?


EDITADO: Obrigado pela sua resposta, Sadie, eu estou aceitando isso, porque ela não funciona da maneira que eu queria saber nesta questão. Mas eu tenho um par de comentários (muito tempo para estar no campo de comentários da sua resposta):

1) Eu fiz ler a documentação (veja links acima), mas não está claro que com apenas includes você está, na verdade também excluindo tudo o resto

2) Quando você apenas registros includes formiga algo como

[javac] Compiling 1 source file to /my/path/to/build

mesmo se as dependências tornam a compilação (muito) mais do que apenas um arquivo de origem.

Foi útil?

Solução

Por que você está excluindo, assim como incluindo? Se você tem pelo menos um incluem, em seguida, os arquivos só são compiladas se eles estão incluídos explicitamente. Portanto, este deve funcionar:

<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath"
        includes="src/path/to/MyClass.java" />

Ou, mais flexível:

<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath">
    <include name="src/path/to/MyClass.java"/>
    <include name="src/path/to/AnotherClass.java"/>
</javac>

Para incluir apenas certos pacotes ou classes em um frasco, use um atributo conjunto de arquivos

<jar jarfile="${outlib}/something.jar">
    <fileset dir="${build.dir}">
        <include name='src/path/to/classes' />
    </fileset>
</jar>

Mais uma vez, você pode usar múltiplos inclui combinar pacotes separados. Experiência com inclui e ler a documentação e você está certo de encontrar a resposta que você precisa.

Outras dicas

velha questão, mas eu estava lutando com o mesmo problema e encontrou uma solução mais elegante. Então aqui está, para referência futura:

De acordo com os documentos da formiga do elemento <javac> é um <fileset> implícito e, como tal, pode tomar seletores como <filename name="**/MyClass.java"/>, então isso seria MyClass.java única compilação:

<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath">
  <filename name="**/path/to/MyClass.java"/>
</javac>

Na verdade, formiga única verificações tudo, se você executar uma compilação duas vezes seguidas você vai notar a segunda é muito mais rápido. Na verdade, ele pode ser facilmente persuadido a coisas perder.

Se você não quer mesmo a considerar tudo, você vai ter que dividi-la em módulos / projectos / árvores de origem menores, de modo que você está dizendo explicitamente formiga que para compilar.

Apenas dão apenas a vírgula lista de arquivos separados que você quer construir. Deixa exemplo digamos

<property name="includeFileList" value="<name of java class>.java"/>

<javac srcdir="${src.dir}" destdir="${build.dir}"
       target="1.6" debug="true" includes="${includeFileList}"/>

Ele vai trabalhar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top