小编Cha*_*ack的帖子

Java:曾经见过一个编译器或工具,它在数组初始化器中拒绝最后一个逗号?

我的神秘面纱就是这样开始的.考虑一下这段代码:

import java.util.Set;
import javax.annotation.processing.*;
import javax.lang.model.element.TypeElement;

@SupportedOptions({
  "thing1",
  "thing2",
})
public class fc extends AbstractProcessor
{
  @Override
  public boolean process( Set<? extends TypeElement> anns, RoundEnvironment re)
  {
    return false;
  }
}
Run Code Online (Sandbox Code Playgroud)

如果你看过大多数脚手架(我只是想确保它完全没有完成并且你可以运行你的编译器),你会看到中间有一个注释,它需要一个String数组初始化器,并且有一个逗号之后"thing2".现在,如果你是那种让Java语言规范在晚上与你同住的人,你会记得最后一个逗号是完全有效的,"可能会出现在数组初始值设定项中的最后一个表达式之后被忽略." 因此,如果您在自己喜欢的地方尝试这个javac,那么它完全编译就不会感到惊讶.

所以这就是谜.上面的示例直接来自真实项目中请求的真实补丁,因为有人在构建该项目时获得了真正的"非法表达式"编译器消息,并在删除最终逗号时离开了.

很明显,那个人正在使用一个braindamaged版本javac,或者在他的工具链中有一些其他的whizbang source munging工具,它没有完全正确的Java语法,虽然他在他的错误报告中提供了其他完整的信息,在这种情况下只有真正重要的信息将是谁的编译器和工具链以及他正在使用的版本,并且他没有提供任何这些!因此,不仅是对不需要它的代码进行了虚假修补,而且没有足够的信息来提交它真正需要的错误报告,工具供应商会在有效的Java上产生虚假错误.

所以,我有点众包这个:) ...任何人都可以找到一个不能成功编译上述代码的Java编译器或其他相关工具,但会标记类似于此示例中报告的错误吗?那么也许我们会知道罪魁祸首是什么.

我只是部分地感到恼怒,因为我的代码被虚假修补了;)...它至少让我感到烦恼,因为可能还有一些尚未修复的工具,并且会让更多的人感到困惑关于什么是Java和什么不是,并导致更多奇怪的补丁代码没问题.

谢谢!

java arrays syntax initializer

10
推荐指数
1
解决办法
102
查看次数

如何使maven-compiler-plugin不会隐藏错误源位置

也许有一个maven-compiler-plugin选择,但我没有找到它.

javac直接运行并打印错误时,在消息的第一行之后,它会在指向错误位置的下一行显示受影响的源代码行.它看起来像这样:

com/invariantproperties/udt/sql/RationalUDT.java:324: error: cannot find symbol
    public static boolean lessThan(RRationalUDT p, double q) {
                                   ^
  symbol:   class RRationalUDT
  location: class RationalUDT
Run Code Online (Sandbox Code Playgroud)

注意直接指向我拼写错误类型名称的行.它maven-compiler-plugin显示如下:

[ERROR] /var/tmp/pljava-udt-type-extension/java/src/main/java/com/invariantproperties/udt/sql/RationalUDT.java:[324,36] cannot find symbol
  symbol:   class RRationalUDT
  location: class com.invariantproperties.udt.sql.RationalUDT
Run Code Online (Sandbox Code Playgroud)

注意它摆脱了实际指向错误的行.(这是使用Oracle JDK 7.)

好的,所以起初我认为这个较旧的问题会得到答案,因为它也maven-compiler-plugin没有显示整个错误消息,并且说修复程序是更新到maven-compiler-plugin3.1版.

但是对于这个问题,我尝试了2.4,3.1和3.5而没有任何改进.显示错误的行总是丢失.

这适用于任何javac错误.在示例中,我拼错了一个符号,只是为了得到与旧问题所讨论的相同的错误.但我可以修复那个并制作另一个(这个来自javac注释处理器):

com/invariantproperties/udt/sql/RationalUDT.java:324: error: No known mapping to an SQL type
    public static boolean lessThan(RationalUDT p, double q) {
                                               ^ …
Run Code Online (Sandbox Code Playgroud)

java maven-3 maven maven-compiler-plugin

8
推荐指数
1
解决办法
418
查看次数

保持浅git克隆只是最新的一种方法?

我的目标是能够构建一个具有悠久历史的项目的最新版本并为之做出贡献 - 并且不使用本地存储来复制许多历史分支和历史可以追溯到十年甚至更长时间(无论如何,我总是可以在项目的中央存储库的Web UI中查找,如果我需要的话,我可能不会这样做.

我第一次尝试时似乎很幸运:

git clone --depth 40 -b master http://github.com/who/what.git/ what
Run Code Online (Sandbox Code Playgroud)

这给了我一个整洁的本地克隆'什么'只有' master'分支,并有足够的承诺来涵盖最近的两个标记版本.
然后我可以做' git checkout latest-release-tag并构建最新版本.yippee的!

正如我想象的那样,我需要做一个补丁.一切顺利进行:' git checkout -b my-patch-branch',进行我的更改,提交,我能够将我的补丁分支推回到github上的克隆,以便项目可以拉动它.简单!
我觉得我很幸运,因为根据我的阅读,例如,在这里,我不能在git 1.9之前做到这一点.
但安装的版本竟然是1.9,所以我侥幸成功.

现在我要做的下一个显而易见的事情是从远程获取并获取master上的最新活动(包括我的补丁的上游合并,所以我不再需要该分支).我尝试了'git fetch --dry-run upstream'并惊恐地看着它无数兆字节的下载,然后给了我一个新的标签列表,可以追溯到乳齿象时代.我很高兴我说--dry-run!

我真的希望它能master从我的克隆的HEAD中获得十几个新的提交,然后我可能会有一个深度52克隆而不是40,但这就是我想要的......在我介入之前,先从有用的近期历史开始,然后从这一点开始跟踪和增长,并能够构建,分支和推送补丁.它似乎非常接近.

有没有简单的方法让git做我想做的事情?我想做的不合理吗?

编辑:更多信息.
(1)上流实际上是靠近我提前一百次,我估计十几次被拉出空中.
(2)事实证明,我在克隆中获得的原始40次提交都是单父提交.我正在尝试获取的一堆后者是在我的克隆不包含的某个分支中与第二个父进行合并提交.因为我克隆中最早的提交不是一个共同的祖先,那些是否会导致git引入他们所有的古代历史?
有没有办法告诉它我不想要那个?

更多新信息:
(1)我之前发现我之前使用的是http协议,它实际上并没有与服务器上的git进程交互,所以它没有机会定制下载大小.
但是,当我使用git-over-ssh重试时,我仍然有一个巨大的提取.
然后
(2)手动,就像动物一样,我点击了github的'newtork'显示中显示的合并提交,找到涉及在我的浅切之前开始的分支的那些,并将他们的父-2 SHA添加到我的.git/shallow文件中,然后尝试再次在ssh上'git fetch'.这很好用,并下载了一个小包文件,可以快速转发我当地的master分支机构.我认为这正是我想要git能够自动完成的操作,但我还没有找到办法.手动,这很乏味.:)

git version-control github shallow-clone

7
推荐指数
1
解决办法
864
查看次数