You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by da...@apache.org on 2018/11/04 18:01:02 UTC

lucene-solr:jira/gradle: Add forbiddenApi check

Repository: lucene-solr
Updated Branches:
  refs/heads/jira/gradle 44d676eac -> 58e7b7a9d


Add forbiddenApi check


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/58e7b7a9
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/58e7b7a9
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/58e7b7a9

Branch: refs/heads/jira/gradle
Commit: 58e7b7a9d0e2f409dee60b2b9bb688eceface987
Parents: 44d676e
Author: Cao Manh Dat <da...@apache.org>
Authored: Sun Nov 4 18:00:54 2018 +0000
Committer: Cao Manh Dat <da...@apache.org>
Committed: Sun Nov 4 18:00:54 2018 +0000

----------------------------------------------------------------------
 build.gradle                                    | 24 ++++----
 buildSrc/build.gradle                           |  2 +
 .../org/apache/lucene/gradle/BuildPlugin.groovy | 40 +++++++++++++
 buildSrc/src/main/resources/forbidden/base.txt  | 60 ++++++++++++++++++++
 .../src/main/resources/forbidden/lucene.txt     | 53 +++++++++++++++++
 .../main/resources/forbidden/servlet-api.txt    | 43 ++++++++++++++
 buildSrc/src/main/resources/forbidden/solr.txt  | 57 +++++++++++++++++++
 buildSrc/src/main/resources/forbidden/solrj.txt | 40 +++++++++++++
 buildSrc/src/main/resources/forbidden/tests.txt | 29 ++++++++++
 lucene/core/build.gradle                        |  1 -
 10 files changed, 335 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/58e7b7a9/build.gradle
----------------------------------------------------------------------
diff --git a/build.gradle b/build.gradle
index 6c46251..3a0a1a1 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,11 +1,6 @@
 import org.apache.lucene.gradle.CheckWorkingCopy
+import org.apache.lucene.gradle.BuildPlugin
 
-/*
- * This file was generated by the Gradle 'init' task.
- *
- * This is a general purpose Gradle build.
- * Learn how to create Gradle builds at https://guides.gradle.org/creating-new-gradle-builds/
- */
 allprojects {
     repositories {
     	mavenCentral()
@@ -27,14 +22,17 @@ allprojects {
 }
 
 subprojects {
-	plugins.withType(JavaPlugin) {
-		test {
-			systemProperty 'java.security.egd', 'file:/dev/./urandom'
+	pj ->
+		plugins.withType(JavaPlugin) {
+			test {
+				systemProperty 'java.security.egd', 'file:/dev/./urandom'
+			}
+
+			pj.plugins.apply(BuildPlugin)
+		}
+		tasks.withType(Test) {
+			maxParallelForks = Runtime.runtime.availableProcessors() / 2
 		}
-	}
-	tasks.withType(Test) {
-		maxParallelForks = Runtime.runtime.availableProcessors() / 2
-	}
 }
 
 tasks.create('checkWorkingCopy', CheckWorkingCopy, true)

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/58e7b7a9/buildSrc/build.gradle
----------------------------------------------------------------------
diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle
index 20921a9..fa4ef3c 100644
--- a/buildSrc/build.gradle
+++ b/buildSrc/build.gradle
@@ -11,4 +11,6 @@ dependencies {
 	compile localGroovy()
 
 	compile 'org.eclipse.jgit:org.eclipse.jgit:4.6.0.201612231935-r'
+	compile 'de.thetaphi:forbiddenapis:2.5'
+	compile 'org.apache.rat:apache-rat:0.11'
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/58e7b7a9/buildSrc/src/main/groovy/org/apache/lucene/gradle/BuildPlugin.groovy
----------------------------------------------------------------------
diff --git a/buildSrc/src/main/groovy/org/apache/lucene/gradle/BuildPlugin.groovy b/buildSrc/src/main/groovy/org/apache/lucene/gradle/BuildPlugin.groovy
new file mode 100644
index 0000000..570466c
--- /dev/null
+++ b/buildSrc/src/main/groovy/org/apache/lucene/gradle/BuildPlugin.groovy
@@ -0,0 +1,40 @@
+package org.apache.lucene.gradle
+
+import de.thetaphi.forbiddenapis.gradle.CheckForbiddenApis
+import de.thetaphi.forbiddenapis.gradle.ForbiddenApisPlugin
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+
+class BuildPlugin implements Plugin<Project> {
+
+    @Override
+    void apply(Project project) {
+        project.pluginManager.apply(ForbiddenApisPlugin.class)
+        project.forbiddenApis {
+            failOnUnsupportedJava = false
+            bundledSignatures = ['jdk-unsafe', 'jdk-deprecated', 'jdk-non-portable', 'jdk-reflection']
+            signaturesURLs = [getClass().getResource('/forbidden/base.txt')]
+            suppressAnnotations = ['**.SuppressForbidden']
+        }
+
+        project.tasks.withType(CheckForbiddenApis) {
+            if (name.endsWith('Test')) {
+                signaturesURLs = project.forbiddenApis.signaturesURLs +
+                        [getClass().getResource('/forbidden/tests.txt')]
+            }
+            if (project.group.equals("org.apache.lucene")) {
+                signaturesURLs = project.forbiddenApis.signaturesURLs +
+                        [getClass().getResource('/forbidden/lucene.txt')]
+            }
+            if (project.group.equals("org.apache.solr") ) {
+                if (project.name.equals("solrj")) {
+                    signaturesURLs = project.forbiddenApis.signaturesURLs +
+                            [getClass().getResource('/forbidden/solrj.txt')]
+                } else {
+                    signaturesURLs = project.forbiddenApis.signaturesURLs +
+                            [getClass().getResource('/forbidden/solr.txt'), getClass().getResource('/forbidden/servlet-api.txt')]
+                }
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/58e7b7a9/buildSrc/src/main/resources/forbidden/base.txt
----------------------------------------------------------------------
diff --git a/buildSrc/src/main/resources/forbidden/base.txt b/buildSrc/src/main/resources/forbidden/base.txt
new file mode 100644
index 0000000..0a81d03
--- /dev/null
+++ b/buildSrc/src/main/resources/forbidden/base.txt
@@ -0,0 +1,60 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You under the Apache License, Version 2.0
+#  (the "License"); you may not use this file except in compliance with
+#  the License.  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+
+@defaultMessage Spawns threads with vague names; use a custom thread factory (Lucene's NamedThreadFactory, Solr's DefaultSolrThreadFactory) and name threads so that you can tell (by its name) which executor it is associated with
+java.util.concurrent.Executors#newFixedThreadPool(int)
+java.util.concurrent.Executors#newSingleThreadExecutor()
+java.util.concurrent.Executors#newCachedThreadPool()
+java.util.concurrent.Executors#newSingleThreadScheduledExecutor()
+java.util.concurrent.Executors#newScheduledThreadPool(int)
+java.util.concurrent.Executors#defaultThreadFactory()
+java.util.concurrent.Executors#privilegedThreadFactory()
+
+@defaultMessage Properties files should be read/written with Reader/Writer, using UTF-8 charset. This allows reading older files with unicode escapes, too.
+java.util.Properties#load(java.io.InputStream)
+java.util.Properties#save(java.io.OutputStream,java.lang.String)
+java.util.Properties#store(java.io.OutputStream,java.lang.String)
+
+@defaultMessage The context classloader should never be used for resource lookups, unless there is a 3rd party library that needs it. Always pass a classloader down as method parameters.
+java.lang.Thread#getContextClassLoader()
+java.lang.Thread#setContextClassLoader(java.lang.ClassLoader)
+
+java.lang.Character#codePointBefore(char[],int) @ Implicit start offset is error-prone when the char[] is a buffer and the first chars are random chars
+java.lang.Character#codePointAt(char[],int) @ Implicit end offset is error-prone when the char[] is a buffer and the last chars are random chars
+
+java.io.File#delete() @ use Files.delete for real exception, IOUtils.deleteFilesIgnoringExceptions if you dont care
+
+java.util.Collections#shuffle(java.util.List) @ Use shuffle(List, Random) instead so that it can be reproduced
+
+java.util.Locale#forLanguageTag(java.lang.String) @ use new Locale.Builder().setLanguageTag(...).build() which has error handling
+java.util.Locale#toString() @ use Locale#toLanguageTag() for a standardized BCP47 locale name
+
+@defaultMessage Constructors for wrapper classes of Java primitives should be avoided in favor of the public static methods available or autoboxing
+java.lang.Integer#<init>(int)
+java.lang.Integer#<init>(java.lang.String)
+java.lang.Byte#<init>(byte)
+java.lang.Byte#<init>(java.lang.String)
+java.lang.Short#<init>(short)
+java.lang.Short#<init>(java.lang.String)
+java.lang.Long#<init>(long)
+java.lang.Long#<init>(java.lang.String)
+java.lang.Boolean#<init>(boolean)
+java.lang.Boolean#<init>(java.lang.String)
+java.lang.Character#<init>(char)
+java.lang.Float#<init>(float)
+java.lang.Float#<init>(double)
+java.lang.Float#<init>(java.lang.String)
+java.lang.Double#<init>(double)
+java.lang.Double#<init>(java.lang.String)

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/58e7b7a9/buildSrc/src/main/resources/forbidden/lucene.txt
----------------------------------------------------------------------
diff --git a/buildSrc/src/main/resources/forbidden/lucene.txt b/buildSrc/src/main/resources/forbidden/lucene.txt
new file mode 100644
index 0000000..2a1d883
--- /dev/null
+++ b/buildSrc/src/main/resources/forbidden/lucene.txt
@@ -0,0 +1,53 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You under the Apache License, Version 2.0
+#  (the "License"); you may not use this file except in compliance with
+#  the License.  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+
+@defaultMessage Use NIO.2 instead
+java.io.File
+java.io.FileInputStream
+java.io.FileOutputStream
+java.io.PrintStream#<init>(java.lang.String,java.lang.String)
+java.io.PrintWriter#<init>(java.lang.String,java.lang.String)
+java.util.Formatter#<init>(java.lang.String,java.lang.String,java.util.Locale)
+java.io.RandomAccessFile
+java.nio.file.Path#toFile()
+java.util.jar.JarFile
+java.util.zip.ZipFile
+@defaultMessage Use home-grown methods instead
+java.lang.Math#toRadians(double)
+java.lang.Math#toDegrees(double)
+
+@defaultMessage Prefer using ArrayUtil as Arrays#copyOfRange fills zeros for bad bounds
+java.util.Arrays#copyOfRange(byte[],int,int)
+java.util.Arrays#copyOfRange(char[],int,int)
+java.util.Arrays#copyOfRange(short[],int,int)
+java.util.Arrays#copyOfRange(int[],int,int)
+java.util.Arrays#copyOfRange(long[],int,int)
+java.util.Arrays#copyOfRange(float[],int,int)
+java.util.Arrays#copyOfRange(double[],int,int)
+java.util.Arrays#copyOfRange(boolean[],int,int)
+java.util.Arrays#copyOfRange(java.lang.Object[],int,int)
+java.util.Arrays#copyOfRange(java.lang.Object[],int,int,java.lang.Class)
+
+@defaultMessage Prefer using ArrayUtil as Arrays#copyOf fills zeros for bad bounds
+java.util.Arrays#copyOf(byte[],int)
+java.util.Arrays#copyOf(char[],int)
+java.util.Arrays#copyOf(short[],int)
+java.util.Arrays#copyOf(int[],int)
+java.util.Arrays#copyOf(long[],int)
+java.util.Arrays#copyOf(float[],int)
+java.util.Arrays#copyOf(double[],int)
+java.util.Arrays#copyOf(boolean[],int)
+java.util.Arrays#copyOf(java.lang.Object[],int)
+java.util.Arrays#copyOf(java.lang.Object[],int,java.lang.Class)

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/58e7b7a9/buildSrc/src/main/resources/forbidden/servlet-api.txt
----------------------------------------------------------------------
diff --git a/buildSrc/src/main/resources/forbidden/servlet-api.txt b/buildSrc/src/main/resources/forbidden/servlet-api.txt
new file mode 100644
index 0000000..dc82e8f
--- /dev/null
+++ b/buildSrc/src/main/resources/forbidden/servlet-api.txt
@@ -0,0 +1,43 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You under the Apache License, Version 2.0
+#  (the "License"); you may not use this file except in compliance with
+#  the License.  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+
+@defaultMessage Servlet API method is parsing request parameters without using the correct encoding if no extra configuration is given in the servlet container
+
+javax.servlet.ServletRequest#getParameter(java.lang.String) 
+javax.servlet.ServletRequest#getParameterMap() 
+javax.servlet.ServletRequest#getParameterNames() 
+javax.servlet.ServletRequest#getParameterValues(java.lang.String) 
+
+javax.servlet.http.HttpServletRequest#getSession() @ Servlet API getter has side effect of creating sessions
+
+@defaultMessage Servlet API method is broken and slow in some environments (e.g., Jetty's UTF-8 readers)
+
+javax.servlet.ServletRequest#getReader()
+javax.servlet.ServletResponse#getWriter()
+javax.servlet.ServletInputStream#readLine(byte[],int,int) 
+javax.servlet.ServletOutputStream#print(boolean)
+javax.servlet.ServletOutputStream#print(char)
+javax.servlet.ServletOutputStream#print(double)
+javax.servlet.ServletOutputStream#print(float)
+javax.servlet.ServletOutputStream#print(int)
+javax.servlet.ServletOutputStream#print(long)
+javax.servlet.ServletOutputStream#print(java.lang.String)
+javax.servlet.ServletOutputStream#println(boolean)
+javax.servlet.ServletOutputStream#println(char)
+javax.servlet.ServletOutputStream#println(double)
+javax.servlet.ServletOutputStream#println(float)
+javax.servlet.ServletOutputStream#println(int)
+javax.servlet.ServletOutputStream#println(long)
+javax.servlet.ServletOutputStream#println(java.lang.String)

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/58e7b7a9/buildSrc/src/main/resources/forbidden/solr.txt
----------------------------------------------------------------------
diff --git a/buildSrc/src/main/resources/forbidden/solr.txt b/buildSrc/src/main/resources/forbidden/solr.txt
new file mode 100644
index 0000000..303f0a8
--- /dev/null
+++ b/buildSrc/src/main/resources/forbidden/solr.txt
@@ -0,0 +1,57 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You under the Apache License, Version 2.0
+#  (the "License"); you may not use this file except in compliance with
+#  the License.  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+
+@defaultMessage Spawns threads without MDC logging context; use ExecutorUtil.newMDCAwareFixedThreadPool instead
+java.util.concurrent.Executors#newFixedThreadPool(int,java.util.concurrent.ThreadFactory)
+
+@defaultMessage Spawns threads without MDC logging context; use ExecutorUtil.newMDCAwareSingleThreadExecutor instead
+java.util.concurrent.Executors#newSingleThreadExecutor(java.util.concurrent.ThreadFactory)
+
+@defaultMessage Spawns threads without MDC logging context; use ExecutorUtil.newMDCAwareCachedThreadPool instead
+java.util.concurrent.Executors#newCachedThreadPool(java.util.concurrent.ThreadFactory)
+
+@defaultMessage Use ExecutorUtil.MDCAwareThreadPoolExecutor instead of ThreadPoolExecutor
+java.util.concurrent.ThreadPoolExecutor#<init>(int,int,long,java.util.concurrent.TimeUnit,java.util.concurrent.BlockingQueue,java.util.concurrent.ThreadFactory,java.util.concurrent.RejectedExecutionHandler)
+java.util.concurrent.ThreadPoolExecutor#<init>(int,int,long,java.util.concurrent.TimeUnit,java.util.concurrent.BlockingQueue)
+java.util.concurrent.ThreadPoolExecutor#<init>(int,int,long,java.util.concurrent.TimeUnit,java.util.concurrent.BlockingQueue,java.util.concurrent.ThreadFactory)
+java.util.concurrent.ThreadPoolExecutor#<init>(int,int,long,java.util.concurrent.TimeUnit,java.util.concurrent.BlockingQueue,java.util.concurrent.RejectedExecutionHandler)
+
+@defaultMessage Use slf4j classes instead
+org.apache.log4j.**
+org.apache.logging.log4j.**
+java.util.logging.**
+
+@defaultMessage Use RTimer/TimeOut/System.nanoTime for time comparisons, and `new Date()` output/debugging/stats of timestamps. If for some miscellaneous reason, you absolutely need to use this, use a SuppressForbidden.
+java.lang.System#currentTimeMillis()
+
+@defaultMessage Use corresponding Java 8 functional/streaming interfaces
+com.google.common.base.Function
+com.google.common.base.Joiner
+com.google.common.base.Predicate
+com.google.common.base.Supplier
+
+@defaultMessage Use java.nio.charset.StandardCharsets instead
+com.google.common.base.Charsets
+org.apache.commons.codec.Charsets
+
+@defaultMessage Use methods in java.util.Objects instead
+com.google.common.base.Objects#equal(java.lang.Object,java.lang.Object)
+com.google.common.base.Objects#hashCode(java.lang.Object[])
+com.google.common.base.Preconditions#checkNotNull(java.lang.Object)
+com.google.common.base.Preconditions#checkNotNull(java.lang.Object,java.lang.Object)
+
+@defaultMessage Use methods in java.util.Comparator instead
+com.google.common.collect.Ordering
+

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/58e7b7a9/buildSrc/src/main/resources/forbidden/solrj.txt
----------------------------------------------------------------------
diff --git a/buildSrc/src/main/resources/forbidden/solrj.txt b/buildSrc/src/main/resources/forbidden/solrj.txt
new file mode 100644
index 0000000..f8ce502
--- /dev/null
+++ b/buildSrc/src/main/resources/forbidden/solrj.txt
@@ -0,0 +1,40 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You under the Apache License, Version 2.0
+#  (the "License"); you may not use this file except in compliance with
+#  the License.  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+
+@defaultMessage Spawns threads without MDC logging context; use ExecutorUtil.newMDCAwareFixedThreadPool instead
+java.util.concurrent.Executors#newFixedThreadPool(int,java.util.concurrent.ThreadFactory)
+
+@defaultMessage Spawns threads without MDC logging context; use ExecutorUtil.newMDCAwareSingleThreadExecutor instead
+java.util.concurrent.Executors#newSingleThreadExecutor(java.util.concurrent.ThreadFactory)
+
+@defaultMessage Spawns threads without MDC logging context; use ExecutorUtil.newMDCAwareCachedThreadPool instead
+java.util.concurrent.Executors#newCachedThreadPool(java.util.concurrent.ThreadFactory)
+
+@defaultMessage Use ExecutorUtil.MDCAwareThreadPoolExecutor instead of ThreadPoolExecutor
+java.util.concurrent.ThreadPoolExecutor#<init>(int,int,long,java.util.concurrent.TimeUnit,java.util.concurrent.BlockingQueue,java.util.concurrent.ThreadFactory,java.util.concurrent.RejectedExecutionHandler)
+java.util.concurrent.ThreadPoolExecutor#<init>(int,int,long,java.util.concurrent.TimeUnit,java.util.concurrent.BlockingQueue)
+java.util.concurrent.ThreadPoolExecutor#<init>(int,int,long,java.util.concurrent.TimeUnit,java.util.concurrent.BlockingQueue,java.util.concurrent.ThreadFactory)
+java.util.concurrent.ThreadPoolExecutor#<init>(int,int,long,java.util.concurrent.TimeUnit,java.util.concurrent.BlockingQueue,java.util.concurrent.RejectedExecutionHandler)
+
+@defaultMessage Use slf4j classes instead
+org.apache.log4j.**
+org.apache.logging.log4j.**
+java.util.logging.**
+
+@defaultMessage Use RTimer/TimeOut/System.nanoTime for time comparisons, and `new Date()` output/debugging/stats of timestamps. If for some miscellaneous reason, you absolutely need to use this, use a SuppressForbidden.
+java.lang.System#currentTimeMillis()
+
+@defaultMessage Use java.nio.charset.StandardCharsets instead
+org.apache.commons.codec.Charsets

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/58e7b7a9/buildSrc/src/main/resources/forbidden/tests.txt
----------------------------------------------------------------------
diff --git a/buildSrc/src/main/resources/forbidden/tests.txt b/buildSrc/src/main/resources/forbidden/tests.txt
new file mode 100644
index 0000000..fbcc0dd
--- /dev/null
+++ b/buildSrc/src/main/resources/forbidden/tests.txt
@@ -0,0 +1,29 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You under the Apache License, Version 2.0
+#  (the "License"); you may not use this file except in compliance with
+#  the License.  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+
+junit.framework.TestCase @ All classes should derive from LuceneTestCase
+
+java.util.Random#<init>() @ Use RandomizedRunner's random() instead
+java.lang.Math#random() @ Use RandomizedRunner's random().nextDouble() instead
+
+# TODO: fix tests that do this!
+#java.lang.System#currentTimeMillis() @ Don't depend on wall clock times
+#java.lang.System#nanoTime() @ Don't depend on wall clock times
+
+com.carrotsearch.randomizedtesting.annotations.Seed @ Don't commit hardcoded seeds
+
+@defaultMessage Use LuceneTestCase.collate instead, which can avoid JDK-8071862
+java.text.Collator#compare(java.lang.Object,java.lang.Object)
+java.text.Collator#compare(java.lang.String,java.lang.String)

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/58e7b7a9/lucene/core/build.gradle
----------------------------------------------------------------------
diff --git a/lucene/core/build.gradle b/lucene/core/build.gradle
index 434b5c0..da6f5aa 100644
--- a/lucene/core/build.gradle
+++ b/lucene/core/build.gradle
@@ -1,6 +1,5 @@
 apply plugin: 'java'
 
-group = 'org.apache.lucene'
 archivesBaseName = 'core'
 
 dependencies {