现在的位置: 首页 > 综合 > 正文

mvn编译有Annotation的java时的奇怪错误

2014年03月29日 ⁄ 综合 ⁄ 共 789字 ⁄ 字号 评论关闭

在Eclipse里编译没有问题,但是用mvn compile时出错。

上网搜了一下,

http://efreedom.com/Question/1-4883387/Illegal-Start-Expression-Annotations

发现是因为Sun的javac在出来annotation的时候不运行数组的最后出现,

比如:

args = {Statement.class, ResultHandler.class}
args = {Statement.class, ResultHandler.class,}


第一行是标准写法,第二行Eclipse是运行的,

但是Sun javac或者Openjdk的javac是会报错的。

由此推测,在Eclipse里编译程序,用的是它自己的javac,我们在Eclipse配置的JDK是运行时或者解决依赖时使用。

那么我们在Eclipse里配置的Jre是干什么用的呢?我们经常把它配置成JDK,这有什么问题吗?

   我猜测Eclipse为了更好的做代码提示,引用分析,所以需要完整的语法分析树。而Javac为了效率,使用的是LL(1) parser,可能保留的信息不足以支持代码提示,编译错误提示等。所以Eclipse实现了自己的Java编译器。javac只是负责把.java文件编译成.class文件。当然Eclipse不可能也没有必要做一个JRE(包括最重要的JVM),所以在Eclipse里运行.class还是需要知道JRE_HOME。

   把JRE配置成JDK对于开发者来说没有任何问题,因为JDK包含全部JRE的东西。但是如果你使用了JDK特有而JRE没有的Jar包,那么你的用户可能运行不了你的程序,因为用户一般只会安装JRE而不是JDK。比如你调用的javac来实时编译java代码。如果你一定要使用的话,那么发布程序时一定要加上这些包,比如tools.jar。

抱歉!评论已关闭.