Ant não consegue encontrar uma classe necessária por um taskdef definido externamente

StackOverflow https://stackoverflow.com/questions/482303

  •  20-08-2019
  •  | 
  •  

Pergunta

Eu estou tentando usar a tarefa formiga eixo java2wsdl para criar um WSDL de uma das minhas classes Java, mas eu não posso obter o classpath correto.

Eu estou usando pacote libaxis-java do Ubuntu que instala eixo ant.jar em $ ANT_HOME / lib e axis.jar em / usr / share / java. As partes interessantes do meu olhar build.xml como esta:

<property name="library.dir" value="lib"/>
<property name="system.library.dir" value="/usr/share/java"/>
<path id="libraries">
    <fileset dir="${library.dir}">
        <include name="*.jar"/>
    </fileset>
    <fileset dir="${system.library.dir}">
        <include name="*.jar"/>
    </fileset>
</path>

<target name="genwsdl" depends="compile">
    <taskdef resource="axis-tasks.properties" classpathref="libraries"/>
    <axis-java2wsdl>
            details omitted
    </axis-java2wsdl>
</target>

Running resultados ant genwsdl em:

/build.xml:50: taskdef A class needed by class
org.apache.axis.tools.ant.wsdl.Wsdl2javaAntTask
cannot be found: org/apache/axis/utils/DefaultAuthenticator

Ant é capaz de encontrar a definição da tarefa eixo java2wsdl, porque eixo ant.jar está em $ ANT_HOME / lib, mas não pode encontrar aulas de axis.jar, apesar de que jar está no caminho definido por "bibliotecas"

Eu sei que é uma questão classpath porque eu era capaz de conseguir DefaultAuthenticator passado para outra classe não seja encontrada por um link simbólico axis.jar em $ ANT_HOME / lib. Como posso obter o taskdef para reconhecer arquivos jar em / usr / share / lib ou lib locais do meu projeto sem criar um link simbólico tudo em $ ANT_HOME / lib?

EDIT:

Eu estava finalmente capaz de gerar com sucesso o wsdl com esta linha:

ant -lib /usr/share/java/axis.jar -lib /usr/share/java/jaxrpc.jar -lib /usr/share/java/wsdl4j.jar -lib /usr/share/java/commons-logging.jar -lib /usr/share/java/commons-discovery.jar -lib build genwsdl

Eu ainda muito que se alguém poderia me dizer o que estou fazendo de errado em não ser capaz de definir essas bibliotecas em build.xml

Foi útil?

Solução

Em geral, isso funciona. Mas você precisa verificar com muito cuidado quais classes são onde.

Se sua classe tarefa pode ser carregado em um carregador de classe mais acima na hierarquia do carregador de classe (como CLASSPATH ou ANT_HOME / lib), então o seu classpathref simplesmente ser ignorados .

Leia a FAQ entrada para mais detalhes.

usa a implementação carregador de classe do Ant modelo de delegação de Java

A classe ClassLoader usa um modelo de delegação de pesquisa para classes e recursos. Cada exemplo de ClassLoader tem um carregador de classe principal associada. Quando chamados a encontrar uma classe ou recurso, uma instância ClassLoader vai delegar a busca para a classe ou de recursos à sua carregador de classe pai antes de tentar encontrar a classe ou o próprio recurso. A máquina virtual é construído-in carregador de classe, chamada de carregador de classe de bootstrap, não em si tem um pai, mas pode servir como o pai de uma instância ClassLoader.

Nota:. Correndo ant -diagnostics pode ajudar também

Outras dicas

mecanismo para bibliotecas adicionando é:

  • via linha de comando argumento -LIB
  • adicionando para $ {user.home} /. Formiga / lib
  • adicionando para $ {ant.home} / lib

Only. A manual do não menciona nada sobre como usar o system.library.dir propriedade . Provavelmente praticamente ignoradas para esta finalidade.

Além disso, formiga executar em detalhado modo (e -verbose) para ver o que está fazendo sob o capô.

Porque não basta tomar a opção mais simples e especificar o classpath em sua <taskdef>?

<taskdef resource="axis-tasks.properties">
    <classpath>
        <fileset file="/path/to/axis/jars"/>
    </classpath>
</taskdef>

Ou criar uma segunda entrada <classpath> que subconjuntos library.dir?

<path id="axis-tools-classpath">
    <fileset dir="/path/to/axis/home">
        <include name="*.jar"/>
    </fileset>
    <path refid="library.dir"/>
</path>

Brincando com ${ant.home}/lib não é tal uma boa idéia e pode ser quase sempre evitado.

Ele funciona para mim para especificar o classpath diretamente na tarefa taskdef, como menstioned pelo Matt b . Para o meu projeto que eu achar que é útil para incluir a biblioteca taskdef na pasta do projeto e especificar o classpath no arquivo de construção Ant, simplesmente configuração em outros pcs desenvolvimento. Eu uso o seguinte taskdef:

<taskdef resource="antenna.properties" classpath="${myprojectroot}/lib/antenna-bin-1.2.1-beta.jar"/>

Note que este pode não funcionar para versões de formiga mais cedo do que 1.7.0.

Usando as respostas aqui e toda a informação parcial, eu vim com uma solução. Eu adicionei o frasco do arquivo ant necessária para uma pasta lib no projeto (especificamente MySQL drivers JDBC). Então eu executar uma tarefa de configuração em formiga que copia para home do usuário .ant / lib pasta e depois falhar formiga com uma mensagem para reiniciar. Ele só não uma vez por um usuário, e depois trabalha o tempo todo. Pode ser complicado se você atualizar o jar para uma nova versão ...

Aqui está o build.xml ant:

<project name="data_source" default="build">

  <!-- BUILD PROPERTIES -->
  <property file="build.properties"/>

  <!-- SQL Server Properties -->
  <property name="sql.driver" value="org.gjt.mm.mysql.Driver"/>
  <property name="sql.url" value="jdbc:mysql://127.0.0.1/datastore"/>
  <property name="sql.user" value="user"/>
  <property name="sql.pass" value="password"/>

  <!-- FILE LOCATIONS  -->
  <property name="sql.dir" location="sql"/>

  <!-- INITIALIZE PROJECT -->
  <target name="init" description="Initialize the project">
      <available property="no.ant.lib.dir" file="${user.home}/.ant/lib/" type="dir" />
  </target>

  <!-- SETUP MYSQL -->
  <target name="setup_mysql" description="Copy the lib so ant can see it" unless="no.ant.lib.dir">
      <mkdir dir="${user.home}/.ant"/>
      <mkdir dir="${user.home}/.ant/lib"/>
      <copy file="lib/mysql-connector-java-5.1.13-bin.jar" todir="${user.home}/.ant/lib"/>

      <!-- ant already missed picking up the jar - we have to restart -->
      <fail message="JDBC mysql class copied to ${user.dir}/.ant/lib/ - please restart ant" />
  </target>

  <!-- BUILD DATA SOURCES -->
  <target name="build" depends="init,setup_mysql,clean_data" description="Create and populate tables">

    <sql driver="${sql.driver}" url="${sql.url}" userid="${sql.user}" password="${sql.pass}" >
      <transaction src="${sql.dir}/create_tables.sql"/>
      <transaction src="${sql.dir}/insert_data.sql"/>
    </sql>
  </target>

   <!-- CLEAN PROJECT -->
  <target name="clean" description="Cleans up project build">
    <!-- Don't clean data sources here - may get called by accident -->
  </target>

  <!-- Delete all tables and data -->
  <target name="clean_data" description="Deletes all data and tables">
    <echo>Dropping all database tables in ${sql.schema}...</echo>
    <property name="exec.command" value="mysqldump -u${sql.user} -p${sql.pass} --add-drop-table --no-data ${sql.schema} | grep ^DROP | mysql -u${sql.user} -p${sql.pass} ${sql.schema}" />
    <exec executable="sh">
      <arg value = "-c"/>
      <arg value="${exec.command}"/>
    </exec>

  </target>

</project>

Espero que isso ajude

Eu encontrei o mesmo problema quando eu copiar um .jar * à {ant.home} / libs, então o usuário i o -LIB para localizar o .jar *, é executado ok! Eu considero que é os novos frascos não pode ser carregado, então eu vou testá-lo!

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