2012-03-08 64 views
10

我打电话的javac从我的Ant脚本是这样的:无法从生成编译太阳专有API警告停止蚂蚁

<javac srcdir="src" 
    destdir="build/classes" source="1.6" 
    target="1.6" debug="true" encoding="Cp1252" 
    nowarn="true"> 

但它仍然抛出编译器警告输出:

[javac] Compiling 73 source files to C:\IKOfficeRoot\Java\ERP\Framework\build\classes 

[javac] C:\IKOfficeRoot\Java\ERP\Framework\src\de\ikoffice\util\LoggerFactory.java:49: warning: sun.reflect.Reflection is Sun proprietary API and may be removed in a future release 
[javac]   return Logger.getLogger(Reflection.getCallerClass(2)); 
[javac]        ^
[javac] Note: C:\IKOfficeRoot\Java\ERP\Framework\src\de\ikoffice\db\SingleShotResultSet.java uses or overrides a deprecated API. 
[javac] Note: Recompile with -Xlint:deprecation for details. 
[javac] Note: Some input files use unchecked or unsafe operations. 
[javac] Note: Recompile with -Xlint:unchecked for details. 
[javac] 1 warning 

我也尝试过

<compilerarg line="-Xlint:-unchecked -Xlint:-deprecation"/> 

<compilerarg value="-Xlint:none"/> 

但这也没有效果。如何删除警告?

+1

可能重复的HTTP启用://sackoverflow.com/questions/1554538/how-can-i-suppress-javac-warnings-about-deprecated-api) – stacker 2012-03-08 06:58:10

+2

不是一个复制!我已经知道如何摆脱弃用警告。我现在需要摆脱不安全的api警告! – Daniel 2012-03-08 11:31:59

+0

[Suppress javac warning“...是内部专有API,可能在未来版本中删除”)的可能重复](http://stackoverflow.com/questions/13855700/suppress-javac-warning-is-internal-privacy -API和 - 可被移除,在-AF)。这一个更早,但我宁愿坚持不提蚂蚁的那个:重要的是javac – 2015-05-01 11:35:11

回答

13

-XDignore.symbol.file选项添加到javac命令行中为我工作。

1

你不能这样做:既不是从命令行,所以你也不能从Ant做到这一点。

javac文件说:

-Xlint:无

禁用所有警告不是由Java语言规范规定的。

所以看起来这种警告不能被压制,因为它们是由JLS直接提出的。

你可以做的是:在需要的位置

  1. 使用@SuppressWarnings({"deprecation"}, {"unchecked"})
  2. 使用一些替代方法的警告信息重定向到/dev/null
  3. 尝试在命令行编译与-Xlint:-unchecked -Xlint:-deprecation参数,也许它只是一个与Ant相关的问题。
+1

-Xlint:-unchecked对我没有任何影响。尽管文档中提到了这些,但似乎没有办法从命令行中抑制警告。 (-Xmaxwarns 0也不起作用) – Antimony 2014-09-18 06:29:39

2

建议:不要忽视编译器的警告。警告是有原因的。我们公司的遗留代码库正在朝着“将警告视为错误并使构建失败”的模式发展,因为我们可以花费精力修复在编译周期中产生的警告。

在你的情况,该警告是:

warning: sun.reflect.Reflection is Sun proprietary API and may be removed in a future release 

它一直警告不要从sun包,只要我能记得导入,因为他们是一个非公开的API。在官方的Oracle Java站点上甚至有关于它的FAQ

您还没有发布您的实际码,很难提供进一步的建议...你在sun.reflect.Reflection中使用的是什么,你不能通过java.lang.reflect中的东西做什么?

+0

因为我们有一个名为“Crash the Server”的按钮。这个使用Unsafe类来修改导致JVM崩溃的位置0处的内存。这个很好的实用程序可以帮助我们测试JVM崩溃恢复代码。而且,这样更快地检查堆栈跟踪。 – Daniel 2014-06-05 05:08:23

0

为防止弃用警告,我尝试使用JDK 6和JDK 7来执行此操作。

随着JDK 7,@Deprecated注释做的工作

随着JDK 6,这是行不通的,既不增加-Xlint:-deprecation PARAM对我的作品。我设法删除警告的唯一方法是使用@deprecatedJavadoc Tag

/** 
    * @deprecated 
    */ 
    @Override 
    public void removeValue(String arg0) { 
    // TODO Auto-generated method stub 
    } 
1

使用nowarn属性见下文

例如

<javac srcdir="src" 
    destdir="build/classes" source="1.6" 
    target="1.6" debug="true" encoding="Cp1252" 
    nowarn="on"> 

默认nowarn属性是关闭

3

要做到这一点,最好的办法是使用sunapi抑制,即无论是-Xlint:-sunapi整个编译或@SuppressWarnings("sunapi")在你需要的范围。

注意,虽则使用这种抑制的唯一办法,就是先用编译器选项-XDenableSunApiLintControl

enableSunApiLintControl

的[我怎样才能抑制有关弃用API javac的警告?](
+0

为我工作,谢谢!与我发现的其他解决方案相比,这不需要从gradle分叉编译器。 – botismarius 2017-08-02 15:54:01

+0

阅读源代码ftw ... – Alun 2017-08-07 22:14:04

+0

可悲的是,这已停止与Java 9 – 2017-12-11 17:36:38