aviso ant: “'includeantruntime' não foi definido”

397

Eu recebo o seguinte aviso:

[javac] build.xml:9: warning: 'includeantruntime' was not set, 
defaulting to build.sysclasspath=last; set to false for repeatable builds

O que isto significa?

user496949
fonte

Respostas:

388

Ant Runtime

Basta definir includeantruntime="false":

<javac includeantruntime="false" ...>...</javac>

Se você precisar usar a javac-tarefa várias vezes, considere usar PreSetDefpara definir sua própria javac-tarefa que sempre define includeantruntime="false".

detalhes adicionais

Em http://www.coderanch.com/t/503097/tools/warning-includeantruntime-was-not-set :

Isso é causado por uma falha de funcionalidade introduzida no Ant 1.8. Basta adicionar um atributo com esse nome à tarefa javac, configurá-lo como false e esquecer que isso já aconteceu.

Em http://ant.apache.org/manual/Tasks/javac.html :

Se as bibliotecas de tempo de execução Ant devem ser incluídas no caminho de classe; o padrão é yes, a menos que build.sysclasspath esteja configurado. Geralmente, é melhor definir isso como false, para que o comportamento do script não seja sensível ao ambiente em que é executado.

Daniel Kutik
fonte
Apache Ant (TM) versão 1.8.2 compilada em 20 de dezembro de 2010
user496949
portanto, se você precisar do tempo de execução do ant no caminho de classe, defina-o como yes / true, caso contrário, no / false. Eu acho que você não precisa disso.
Daniel Kutik
5
+1, ótima resposta. Eu só desejo que eu poderia definir que uma vez em algum lugar no buildfile em vez de jogar lixo todas as chamadas javac com ele ...
Jonik
11
Em que caso está definido como True?
Lorenzo Lerate 30/08/16
"Se deseja incluir as bibliotecas de tempo de execução Ant no caminho da classe; o padrão é sim, a menos que build.sysclasspath esteja definido. Geralmente, é melhor definir isso como false, para que o comportamento do script não seja sensível ao ambiente em que é executado. "
Daniel Kutik
72

Como o @Daniel Kutik mencionou, presetdefé uma boa opção. Especialmente se alguém estiver trabalhando em um projeto com muitos build.xmlarquivos que não podem ou preferem não editar (por exemplo, arquivos de terceiros).

Para usar presetdef, adicione estas linhas no seu build.xmlarquivo de nível superior :

  <presetdef name="javac">
    <javac includeantruntime="false" />
  </presetdef>

Agora todas as javactarefas subseqüentes serão herdadas essencialmente includeantruntime="false". Se seus projetos realmente precisam de bibliotecas ant runtime, você pode adicioná-los explicitamente aos arquivos de compilação OU ao conjunto includeantruntime="true". Este último também se livra dos avisos.

As javactarefas subsequentes ainda podem explicitamente alterar isso, se desejado, por exemplo:

<javac destdir="out" includeantruntime="true">
  <src path="foo.java" />
  <src path="bar.java" />
</javac>

Eu recomendo contra o uso ANT_OPTS. Funciona, mas derrota o objetivo do aviso. O aviso informa que a construção de uma pessoa pode se comportar de maneira diferente em outro sistema. O uso ANT_OPTStorna isso ainda mais provável, porque agora todo sistema precisa usar ANT_OPTSda mesma maneira. Além disso, ANT_OPTSaplicar-se-á globalmente, suprimindo os avisos à vontade em todos os seus projetos

jwfearn
fonte
11
Funciona muito bem para atualizar um arquivo de compilação Ant existente com várias tarefas javac. O elemento presetdef vai apenas para dentro do elemento do projeto.
saxman 29/05
@jwfearn: Um presetdeftruque semelhante pode ser feito para trabalhar com tarefas Ant não integradas? Eu tentei fazer isso scalac, mas como os build.xmlarquivos inferiores precisam definir manualmente a scalactarefa, eles substituem o que eu definir no nível superior.
Stuart Golodetz
2
Uma observação: o uso do presetdef causará um aviso de formiga que a tarefa javac foi redefinida. Adicionar um tempo de execução a cada tarefa javac evita isso. Não estou ciente das desvantagens do aviso. Mas isso pode ser útil para pessoas que 'precisam' de construções limpas.
Mikijov
Sim, o presetdef dá "Tentar substituir definição antiga de javac tarefa"
Mike Jones
62

Chet Hosey escreveu uma boa explicação aqui :

Historicamente, o Ant sempre incluía seu próprio tempo de execução no caminho de classe disponibilizado para a tarefa javac. Portanto, todas as bibliotecas incluídas no Ant e as bibliotecas disponíveis para o ant estão automaticamente no caminho de classe da sua compilação, quer você goste ou não.

Foi decidido que isso provavelmente não era o que a maioria das pessoas queria. Então agora há uma opção para isso.

Se você escolher "true" (para incluir o tempo de execução), pelo menos você saberá que seu caminho de classe de construção incluirá o tempo de execução do Ant. Se você escolher "false", estará aceitando o fato de que o comportamento da compilação será alterado entre versões anteriores e 1.8+.

Por mais irritado que esteja com esse aviso, você ficaria ainda menos feliz se suas construções quebrassem completamente. Manter esse comportamento padrão permite que arquivos de compilação não modificados funcionem consistentemente entre as versões do Ant.

kgiannakakis
fonte
3
Eu sempre pensei que esse era o recurso / mensagem mais boba de todos os tempos. Quem deseja 'builds repetíveis' em sua ferramenta de gerenciamento de configuração? ;)
karmakaze
11
Essa resposta parece ser a única que nos diz o que o aviso realmente significa.
ty
26

A resposta de Daniel funciona perfeitamente. Aqui está um trecho de amostra que eu adicionei ao meu build.xml:

<target name="compile">
    <mkdir dir="${classes.dir}"/>
    <javac srcdir="${src.dir}" destdir="${classes.dir}" includeantruntime="false">
                                                 <!--   ^^^^^^^^^^^^^^^^^^^^^^^^^  -->
        <classpath>
            <path id="application" location="${jar.dir}/${ant.project.name}.jar"/>
            <path id="junit" location="${lib.dir}/junit-4.9b2.jar"/>
        </classpath>
    </javac>
</target>
Krishnam Raju
fonte
5

Se você gosta de mim, trabalhe na linha de comando, a resposta rápida está sendo executada

export ANT_OPTS=-Dbuild.sysclasspath=ignore

E, em seguida, execute seu script ant novamente.

slott
fonte
Isso me ajuda muito . Estou usando set ANT_OPTS=-Xms40M -Xmx512M -Dbuild.sysclasspath=ignore.
Paul Vargas
5

Use <property name="build.sysclasspath" value="last"/>no seu arquivo build.xml

Para mais detalhes, procure includeAntRuntimeem Ant javac

Outros valores possíveis podem ser encontrados aqui

Ahmad Nadeem
fonte
-3

eu enfrentei o mesmo, eu check-in no programa e recurso. houve uma atualização de instalação para o jdk1.8 que não é compatível com a minha configuração antiga (jdk1.6.0) para ant no eclipse. Eu instalo essa atualização. No momento, meu projeto de formiga é construir sucesso.

Experimente, espero que isso seja útil.

Garun Kumar Mishra
fonte