我编写了一个客户注释处理器来生成包含在Eclipse插件中的各种源文件.作为此过程的一部分,它还使用通常的调用记录各种错误和警告ProcessingEnvironment#getMessager().printMesssage(Kind, String, Element).
我一直在通过调试Eclipse中的插件来测试处理器.在Eclipse的已启动子实例中,处理器都按预期工作 - 源文件由编译器根据需要生成,拾取和解释.生成和未生成的任何编译器(即非自定义)错误都会出现在编辑器,问题视图等中,如预期的那样.
但是,我发现自定义错误和警告的显示方式存在很多不一致之处.我看到的行为如下:
NOTE它始终显示在Info类型下的Error Log中,无论是否指定了Element.ERROR还是WARNING根据上面的重点,真正的问题是第3项 - 在某些情况下,尽管登录了有效元素,我仍然无法在编辑器中出现错误.实际上,我已经成功地通过简单地更改特定生成的源文件的名称来可靠地显示错误而不会出现.
当然问题不在于文件名本身,但肯定的情况是,生成一个名称与代码中已经存在的引用相匹配的类会导致错误被隐藏,同时使用不同的名称生成错误(或根本不生成错误)会导致错误显示(以及由缺少的类引起的所有常规编译器错误).最奇怪的是,与其他任何类(其中有许多类)相比,这个生成的类没有任何根本的不同,尽管它的结构和引用方式都是独一无二的.它也相当长(约400种方法),但人为地缩短它没有任何区别.其他生成的类在代码中也有现有引用,并且不会抑制错误.
不幸的是,我还没有时间测试是否在部署Eclipse插件时(即在Eclipse的"真实"实例中运行)发生此问题,或者实际上如果在javac显式调用或调用Maven构建时出现问题.
如果没有发布插件的完整代码,我不希望任何人能够直接提供帮助,但如果任何人遇到注释处理器生成的错误的经验问题,我对任何建议或建议都非常开放.在我看来,这似乎是Eclipse中的一个错误,但我无法在线找到它的任何引用.我也无法在底层Eclipse实例或Eclipse的已启动子实例的.metadata/.log文件中找到任何错误.最后,我确保在注释处理器代码中没有抑制或报告异常.
Eclipse版本详细信息:
Version: Luna Service Release 1a (4.4.1)
Build id: 20150109-0600
Run Code Online (Sandbox Code Playgroud)
任何帮助表示感谢,并提前多多感谢:)
我在尝试编写一个在没有给出额外参数的情况下具有默认值的函数时遇到了问题。我试过检测给定的唯一参数是否等于 NULL(如其他答案中所建议的那样),但它似乎对我不起作用。
该函数的实际实现采用一个结构并将其添加到第二个参数中给出的链表中。如果没有给出第二个参数,我希望它将它添加到先前定义的默认全局链表中。
下面是一个使用 int 类型参数的更简单的版本,但我想要做的原理是一样的:
/* appropriate headers... */
void test(int a, ... ) {
int b;
va_list args;
va_start(args,a);
b = va_arg(args,int);
if (b == NULL) { // check if no argument is given and set default value
b = 0;
} // if b != NULL then it should be set to the value of the argument
va_end(args);
printf("%d %d\n",a,b);
}
int main() {
test(1);
test(1,1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,这给出了输出:
1 *random memory address*
1 1
Run Code Online (Sandbox Code Playgroud)
我想要的输出应该有第一行 …
有什么方法可以组合两个 XmlDocuments 而不将第一个保存在内存中?
我必须循环浏览多达一百个大(~300MB)XML 文件的列表,附加到每个多达 1000 个节点,重复整个过程几次(因为新节点列表被清除以节省内存)。目前我XmlDocument在追加新节点之前将整个加载到内存中,这目前是站不住脚的。
你认为最好的方法是什么?我有一些想法,但我不确定哪个是最好的:
XMLDocument,而是使用XmlReader和XmlWriter同时写入临时文件,该文件随后被重命名。XmlDocument仅用于新节点,然后手动将其写入现有的文件(即file.WriteLine( "<node>\n" )任何帮助都感激不尽。
编辑一些更多细节以回答一些评论:
该程序将几个大型日志解析为 XML,按来源分组到不同的文件中。它只需要每天运行一次,并且一旦编写了 XML,就会有一个轻量级的专有阅读器程序来提供有关数据的报告。该程序每天只需要运行一次,所以可能会很慢,但运行在执行其他操作的服务器上,主要是文件压缩和传输,不能影响太多。
数据库可能会更容易,但公司不会很快这样做!
按原样,程序在开发机器上运行最多只使用几 GB 的内存,但在服务器上运行时会抛出内存不足的异常。
最终编辑 该任务的优先级很低,这就是为什么获取数据库只需要额外花费的原因(尽管我会研究 mongo)。
该文件只会被附加到,并且不会无限增长 - 每个最终文件仅用于一天的日志,然后在第二天生成新文件。
我可能会使用 XmlReader/Writer 方法,因为它最容易确保 XML 有效性,但我已经考虑了您的所有评论/答案。我知道拥有这么大的 XML 文件并不是一个特别好的解决方案,但这是我的限制,所以感谢提供的所有帮助。
我有一个非常简单的eclipse链接案例,我在下面转载.如果我可以让下面的例子工作,那么我可以很容易地将它应用于实际的案例.问题是,我不能!
有两个类 - Parent和Child.两者都有一个Stringid,并Parent包含Child字段中的对象列表children.该List儿童有归属@OneToMany,而这两个类有@Entity属性.我正在通过Eclipse运行一切作为Maven项目,persistence.xml存储在中src\main\resources\META_INF\persistence.xml.没有引用其他罐子.
当我打电话时,Persistence.createEntityManagerFactory我得到以下异常.它似乎认为Child不是一个实体!
Exception in thread "main" Local Exception Stack:
Exception [EclipseLink-30005] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.PersistenceUnitLoadingException
Exception Description: An exception was thrown while searching for persistence archives with ClassLoader: sun.misc.Launcher$AppClassLoader@1a8e3115
Internal Exception: javax.persistence.PersistenceException: Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Predeployment of PersistenceUnit [Parent] failed.
Internal Exception: Exception …Run Code Online (Sandbox Code Playgroud) 作为某些逻辑的一部分,在我的程序中有必要将长Java时间戳(包括年,月等)转换为"短"Java时间.这应该对应于原始时间的完全相同的小时,分钟和秒,但是在1970年1月1日的1天内(即0(00:00:00)和86400000(23:59:59)之间的值).一个例子是问题中的转换.
为了执行此操作,我认为以下代码将起作用:
public int convertToTime(long fullTimeStamp) {
Calendar c = Calendar.getInstance();
c.setTimeInMillis(date);
c.set(Calendar.DATE, 1);
c.set(Calendar.MONTH, 0);
c.set(Calendar.YEAR, 1970);
return (int) c.getTimeInMillis();
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是与时区有关.在英国,我们目前在BST.使用该功能设置所有值后,时间保持相同的数字(例如,早上8点),但将时区更改为GMT!格林威治标准时间早上8点与BST早上8点不一样,而是等于早上9点BST.
向该函数添加一些控制台输出会演示此问题:
public int convertToTime(long fullTimeStamp) {
System.out.println(new Date(fullTimeStamp)); // correct
Calendar c = Calendar.getInstance();
c.setTimeInMillis(fullTimeStamp);
System.out.println(c.getTime()); // correct
c.set(Calendar.DATE, 1);
c.set(Calendar.MONTH, 0);
c.set(Calendar.YEAR, 1970);
System.out.println(c.getTime()); // incorrect!
return (int) c.getTimeInMillis();
}
Run Code Online (Sandbox Code Playgroud)
节目输出:
Wed Jun 19 12:15:00 BST 2013 // ok
Wed Jun 19 12:15:00 BST 2013 // this makes sense
Thu Jan 01 12:15:00 GMT 1970 // …Run Code Online (Sandbox Code Playgroud)