Незаконное начало выражения для аннотаций - PullRequest
8 голосов
/ 03 февраля 2011

Я использую Ant для сборки, я получаю следующие ошибки:

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

Класс 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;
    ...

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;
    ...

А вот файл сборки Ant build.xml :

<?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>

Ошибки связаны сАннотации, которые я использую.Что мне нужно сделать, чтобы исправить эту сборку Ant, чтобы скомпилировать аннотации моего класса?

Ответы [ 4 ]

22 голосов
/ 03 февраля 2011

Похоже, у вас есть запятые в массивах аннотаций, которые javac считает незаконными - в отличие от «правильных» массивов. (В eclipse есть ошибка , которая не сообщает об этом как таковой.)

Удалите запятые, например ::1005*.

@MessageDriven(activationConfig =
{ @ActivationConfigProperty( ... ),
  @ActivationConfigProperty( ... ),
  @ActivationConfigProperty( ... ),
  @ActivationConfigProperty( ... ) // no comma here
} );
0 голосов
/ 03 февраля 2011

Определяете ли вы другой уровень источника для javac?

Поскольку для задачи javac рекомендуется всегда указывать атрибут source, возможно, там указана устаревшая версия.

Если ваш скрипт Ant, например, компилируется с использованием исходного уровня 1.4 , у вас не будет обобщений или аннотаций.

Ищите что-то подобное в вашем build.xml:

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

РЕДАКТИРОВАТЬ: Еще один способ установить уровень источника для Ant будет использовать системное свойство ant.build.javac.source, но я сомневаюсь, что это так.

0 голосов
/ 03 февраля 2011

Это сильно указывает на уровень компиляции Java, @DR уже ответил на него. Попробуйте две вещи:

  1. Загрузите последнюю версию ANT, добавьте $ANT_HOME/bin в системный путь, где $ANT_HOME - это каталог, в котором находится ANT (в котором находится bin). Удалите любую ссылку на любой другой ANT.
  2. Откройте свой build.xml, посмотрите блок, в который добавлена ​​задача javac (компиляция). Убедитесь, что это выглядит так

    <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>
    
0 голосов
/ 03 февраля 2011

Это не проблема муравья per se .Скорее всего, это скорее всего синтаксическая ошибка в одном или нескольких файлах Java, которые вы пытаетесь скомпилировать.

Если вы разместили исходный код Java, мы должны быть более конкретны.


Я не знаю, в чем проблема, но я могу точно сказать, что Ant не компилирует саму Java.Вместо этого он использует компилятор Java (из найденного JDK) для компиляции Java.

Так что, если вы получаете ошибки компиляции при компиляции через Ant, но не при компиляции другим способом, то естьчто-то существенное, что отличается от способа запуска компилятора Java:

  • Возможно, вы используете другой компилятор (из другого JDK).
  • Возможно, вы вызываетеКомпилятор будет запускаться с другим путем к классу сборки.
  • Возможно, вы вызываете запуск компилятора с другим уровнем источника.

Второе назначение данных - фактические ошибки, которые вы получаете,Это синтаксические ошибки, а не семантические ошибки.Если бы проблема заключалась в пути к классам сборки, то вы могли бы ожидать семантических ошибок, говорящих (например), что определенные имена аннотаций не были известны.Вместо этого вы получаете синтаксическую ошибку, которая предполагает, что компилятор вообще не понимает аннотации.Это говорит о том, что проблема в том, что компилятор ожидает код Java 1.4 (или более ранний).

Итак, мои предложения:

  • Убедитесь, что Ant настроен на использование недавнего JDK.Проверьте ваши установки Ant и переменные среды, как описано в документации Ant.
  • Убедитесь, что вы правильно установили уровень компилятора source в файле Ant build.xml.Прочтите документацию по Ant для задачи <javac> и посмотрите на ручную запись Sun javac, чтобы убедиться, что вы все делаете правильно.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...