注释中出现了表达式的非法开头

8

我正在使用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构建以编译我的类注释?


5
请提供一个或多个与这些消息相关的源代码片段。 - martin clayton
当你执行 javac -version 命令时,如果你看到的版本是 Java1.4 或更低,则需要将 ANT 的编译级别更改为你所拥有的 Java 版本。如果你的 Java 版本是 5 或以上,则需要相应地更改编译级别。 - Nishant
我得到了javac 1.6.0_11,你在哪里设置ANT的编译级别? - rayman
4个回答

22

看起来您的注释数组中有尾随逗号,这被javac视为非法 - 与“正常”的数组不同。(Eclipse中存在一个错误,无法将其报告为此类错误。)

移除尾随逗号,例如:

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

你是对的,该死,怎么可能是真的?我正在使用MyEclipse7.0。现在用Eclipse编译器的所有错误做这件事将会很烦人。 - rayman

0

这强烈指向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

这不是Ant问题本身。相反,最有可能的是您正在尝试编译的一个或多个Java文件中存在语法错误。

如果您发布了Java源代码,我们应该能够更具体地指出问题所在。


我不知道问题出在哪里,但我可以告诉你一件事情,就是Ant本身并不编译Java。相反,它使用Java编译器(从它找到的JDK中)来编译Java代码。

因此,如果你通过Ant编译时遇到了编译错误,但是用其他方式却没有遇到,那么说明Java编译器运行方式存在显著差异:

  • 你可能使用了不同的编译器(来自不同的JDK)。
  • 你可能导致编译器使用了不同的构建类路径。
  • 你可能导致编译器使用了不同的源级别。

第二个数据点是实际的错误信息。他们是语法错误而不是语义错误。如果问题是构建类路径,那么你会看到语义错误,例如某些注释名称未知。相反,你得到了语法错误,表明编译器根本不理解注释。这表明问题在于编译器期望Java 1.4(或更早)代码。

所以我的建议是:

  • 检查Ant是否配置为使用最新的JDK。请按照Ant文档中所述检查您的Ant安装和环境变量。
  • 检查您是否正确设置了Ant build.xml文件中的编译器级别。阅读Ant <javac>任务的文档,并查看Sun javac手册条目,确保您做得正确。

我编辑了我的问题。虽然没有使用ANT编译,但它仍然可以正常编译。 - rayman

0

你是否为 javac 定义了不同的源级别?

由于建议始终为 javac 任务指定 source 属性,因此您可能会在那里指定一些过时的版本。

例如,如果您的 Ant 脚本使用源级别 1.4 进行编译,则不会有泛型或注释。

在您的 build.xml 中查找类似于以下内容的东西:

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

编辑:设置Ant的源级别的另一种方法是使用系统属性ant.build.javac.source,但我怀疑这不是这里的情况。


我该如何检查/更改javac的源代码级别? - rayman
通常情况下,源级别是从运行Ant脚本的JVM中获取的,除非您在javac任务上使用source属性。(更多详情请参见:http://ant.apache.org/manual/Tasks/javac.html) - Daniel Rikowski
我在我的构建XML中没有那行代码。我会把我的build.xml添加到问题中。 - rayman
我尝试在<javac..中添加source="1.6",但仍然没有成功.. 仍然是同样的错误。我已经粘贴了我的build.xml。 - rayman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接