2011-02-03 13 views
8

estoy usando Ant para construir, estoy recibiendo estos errores:inicio ilegal de expresión para Anotaciones

Buildfile: ...\build.xml 
clean: 
    [delete] Deleting directory D:\IdanWorkSpace\ECMSEJB\classes 
ejb.compile: 
    [mkdir] Created dir: D:\IdanWorkSpace\ECMSEJB\classes 
    [javac] Compiling 26 source files to D:\IdanWorkSpace\ECMSEJB\classes 
    [javac] ...\src\com\mirs\ecms\mdb\ECMSDispatcherMDB.java:28: illegal start of expression 
    [javac] }) 
    [javac]^
    [javac] ...\src\com\mirs\ecms\mdb\ECMSErrorHandlerMDB.java:25: illegal start of expression 
    [javac] } 
    [javac]^
    [javac] 2 errors 

la clase Java: ECMSDispatcherMDB.java

@MessageDriven(activationConfig = { 
    @ActivationConfigProperty(propertyName = "destinationType", 
          propertyValue = "javax.jms.Queue"), 
    @ActivationConfigProperty(propertyName = "destination", 
          propertyValue = Constants.CALLS_QUEUE_LOOKUP), 
    @ActivationConfigProperty(propertyName = "maxSession", 
          propertyValue = "50"), 
    @ActivationConfigProperty(propertyName = "transactionTimeout", 
          propertyValue = "30000"), 
}) 

public class ECMSDispatcherMDB implements MessageListener 
{ 
    Logger logger = Logger.getLogger("ecms.log"); 
    private static final String TAG = "ECMSDispatcherMdb"; 
    ConnectorManager connectorManager = ConnectorManager.getInstance(); 

    @EJB 
    private ECMSEntityManagerDaoLocal dao; 
    ... 

la clase Java: ECMSErrorHandlerMDB.java

@MessageDriven(activationConfig = { 
    @ActivationConfigProperty(propertyName = "destinationType", 
          propertyValue = "javax.jms.Queue"), 
    @ActivationConfigProperty(propertyName = "destination", 
          propertyValue = Constants.ERORR_QUEUE_LOOKUP), 
    @ActivationConfigProperty(propertyName = "maxSession", 
          propertyValue = "50"), 
}) 

public class ECMSErrorHandlerMDB implements MessageListener 
{ 
    Logger logger = Logger.getLogger("ecms.log"); 
    private static final String TAG = "ECMSErrorHandlerMDB"; 
    ConnectorManager connectorManager = ConnectorManager.getInstance(); 

    @EJB 
    private ECMSEntityManagerDaoLocal dao; 
    ... 

y aquí está la hormiga build.xml BuildFile :

<?xml version="1.0" encoding="ISO-8859-1"?> 
<project name="ECMS Ant" basedir="." default="create ear"> 
<property file="build.properties" /> 
<path id="base.path"> 
    <fileset dir="${project.lib}"> 
     <include name="**/*.jar" /> 
    </fileset> 
    <fileset dir="${project.lib2}"> 
     <include name="**/*.jar" /> 
    </fileset> 
</path> 

<target name="clean" description="Delete all generated files"> 
    <delete dir="${ejb.classes.dir}" /> 
    <delete dir="${web.classes.dir}" /> 
    <delete dir="${deploy.dir}" /> 
</target> 

<target name="ejb.compile" description="Compiles the Task" depends="clean"> 
    <mkdir dir="${ejb.classes.dir}" /> 
    <javac srcdir="${ejb.src.dir}" destdir="${ejb.classes.dir}"> 
     <classpath> 
      <path refid="base.path" /> 
     </classpath> 
    </javac> 
</target> 

<target name="web.compile" description="Compiles the Task" depends="ejb.compile"> 
    <mkdir dir="${web.classes.dir}" /> 
    <javac srcdir="${web.src.dir}" destdir="${web.classes.dir}"> 
     <classpath> 
      <path refid="base.path" /> 
      <path refid="${ejb.classes.dir}" /> 
     </classpath> 
    </javac> 
</target> 

<target name="create jar" description="create jar" depends="ejb.compile"> 
    <!-- new jars--> 
    <jar destfile="${deploy.dir}/ecmsejb.jar"> 
     <fileset dir="${ejb.classes.dir}"> 
      <!-- include the folders: facade --> 
     </fileset> 
     <metainf dir="${ejb.src.dir}/META-INF" > 
      <!--exclude name="*application.xml" /--> 
     </metainf> 
    </jar> 
</target> 

<target name="create war" description="Creates war file" depends="web.compile"> 
    <war warfile="${deploy.dir}/ecmsweb.war" 
     webxml="${web.project.root}/WebRoot/WEB-INF/web.xml"> 
     <webinf dir="${web.project.root}/WebRoot/WEB-INF/" /> 
     <classes dir="${web.classes.dir}"> 
      <!-- include the folders: webServices --> 
     </classes> 
     <classes dir="${web.project.root}/WebRoot/WEB-INF/classes" /> 
    </war> 
    <!--delete dir="${project.root}/WebRoot/WEB-INF/classes/META-INF" /--> 
</target> 

<target name="create ear" description="create ear" depends="create war"> 
    <ear destfile="${deploy.dir}/ecms.ear" 
     appxml="${project.root}/META-INF/application.xml"> 
     <fileset dir="${deploy.dir}" /> 
     <metainf dir="${project.root}/META-INF" /> 
    </ear> 
</target> 
</project> 

Los errores están relacionados con las anotaciones que estoy usando. ¿Qué debo hacer para corregir esta compilación Ant para compilar las Anotaciones de mi clase?

+5

fija por favor uno o más fragmentos de código fuente correspondiente a dichos mensajes. –

+0

Editar mi pregunta, gracias. – rayman

+0

¿Qué ves cuando haces 'javac -version'? Es más probable que tengas Java1.4 o menos. Si tiene Java5 o superior, cambie el nivel de compilación en ANT a la versión de Java que tenga. – Nishant

Respuesta

22

Parece que haya detrás de comas en las matrices de anotación, que considera javac como ilegales - a diferencia de las matrices adecuadas ''. (Hay una bug in eclipse que no se informe de inmediato como tal.)

Retire las comas finales, por ejemplo .:

@MessageDriven(activationConfig = 
{ @ActivationConfigProperty(...), 
    @ActivationConfigProperty(...), 
    @ActivationConfigProperty(...), 
    @ActivationConfigProperty(...) // no comma here 
}); 
+0

Tenías razón, maldita sea, ¿cómo podría ser cierto? Estoy usando MyEclipse7.0. ahora será molesto hacerlo con todos los errores del compilador de eclipse – rayman

+2

+1 para informarnos. ¡Guauu! esto ** es ** sorpresa. – Nishant

+0

wow thats nice :) +1 – mprabhat

0

Esto no es un problema de Ant per se. Más bien, lo más probable es que sea un error de sintaxis en uno o más de los archivos Java que está intentando compilar.

Si publicó el código fuente de Java, deberíamos poder ser más específicos.


No sé cuál es el problema, pero puedo decirles que Ant no compila Java. En cambio, utiliza el compilador de Java (del JDK que encuentra) para compilar el Java.

lo tanto, si se producen errores de compilación cuando se compila a través de hormiga, pero no cuando se compila alguna otra manera, entonces hay algo significativo que es diferente acerca de la forma en que el compilador de Java es que se está ejecutando:

  • Es posible que esté utilizando un compilador diferente (de un JDK diferente).
  • Puede estar provocando que el compilador se ejecute con una ruta de clase de compilación diferente.
  • Es posible que el compilador se ejecute con un nivel de origen diferente.

El segundo punto de datos son los errores reales que está recibiendo. Son errores de sintaxis en lugar de errores semánticos. Si el problema era el classpath de compilación, entonces esperaría que los errores semánticos dijeran (por ejemplo) que ciertos nombres de anotación no se conocían. En cambio, está obteniendo un error de sintaxis que sugiere que el compilador no comprende las anotaciones en absoluto. Eso sugiere que el problema es que el compilador espera código Java 1.4 (o anterior).

Así que mis sugerencias son:

  • Compruebe que está configurado para utilizar Ant una reciente JDK. Verifique su instalación Ant y las variables de entorno como se describe en la documentación de Ant.
  • Compruebe que ha configurado correctamente el nivel del compilador fuente en el archivo Ant build.xml. Lea la documentación de Ant para la tarea <javac>, y mire la entrada manual de Sun Java para asegurarse de que está haciendo las cosas bien.
+0

Edito mi pregunta. aunque está compilando bien sin ANT. – rayman

0

¿Está definiendo un nivel de fuente diferente para javac?

Dado que se recomienda especificar siempre el atributo source para la tarea javac, es posible que tenga alguna versión obsoleta especificada allí.

Si su script Ant por ejemplo compila utilizando el nivel de fuente 1.4, no tendrá genéricos ni anotaciones.

buscar algo como esto en su build.xml:

<javac ... source="1.x" ... /> 

EDIT: Otra manera de establecer el nivel de la fuente para la hormiga sería el uso de la propiedad del sistema ant.build.javac.source, pero duda de que es el caso aquí.

+0

¿Cómo puedo verificar/cambiar mi nivel de fuente para javac? – rayman

+0

Normalmente, el nivel de fuente se toma de la JVM que ejecuta el script Ant, a menos que use el atributo 'source' en la tarea' javac'. (Más detalles: http://ant.apache.org/manual/Tasks/javac.html) –

+0

No tengo esa línea en mi compilación xml. Agregaré mi build.xml a la pregunta – rayman

0

Esto apunta fuertemente hacia el nivel de compilación Java, @DR ya lo ha respondido. Trate de dos cosas:

  1. Descargar última ANT, añadir $ANT_HOME/bin a la ruta del sistema, donde $ANT_HOME es el directorio en el que reside la ANT (en virtud del cual existe bin). Elimine cualquier referencia a cualquier otra ANT.
  2. Abra su build.xml, mire el bloque donde se agrega la tarea javac (compilación). Asegúrese de que se parezca a esto

    <target name="ejb.compile" description="Compiles the Task" depends="clean"> 
    <mkdir dir="${ejb.classes.dir}" /> 
    <javac 
        srcdir="${ejb.src.dir}" 
        destdir="${ejb.classes.dir}" 
        fork="true" 
        source="1.6" 
        target="1.6"> 
        <classpath> 
         <path refid="base.path" /> 
        </classpath> 
    </javac> 
    </target> 
        <target name="web.compile" description="Compiles the Task" depends="ejb.compile"> 
    <mkdir dir="${web.classes.dir}" /> 
    <javac 
        srcdir="${web.src.dir}" 
        destdir="${web.classes.dir}" 
        fork="true" 
        source="1.6" 
        target="1.6"> 
        <classpath> 
         <path refid="base.path" /> 
         <path refid="${ejb.classes.dir}" /> 
        </classpath> 
    </javac> 
        </target> 
    
Cuestiones relacionadas