在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。