diff --git a/build.gradle b/build.gradle
index 0905dec369..11c9997e6e 100644
--- a/build.gradle
+++ b/build.gradle
@@ -237,7 +237,7 @@ configure(rootProject) {
apply plugin: "groovy"
apply plugin: "io.spring.nohttp"
- apply from: "${gradleScriptDir}/jdiff.gradle"
+ apply plugin: 'org.springframework.build.api-diff'
apply from: "${gradleScriptDir}/docs.gradle"
nohttp {
diff --git a/buildSrc/README.md b/buildSrc/README.md
index 2cdbf94905..7c722a3627 100644
--- a/buildSrc/README.md
+++ b/buildSrc/README.md
@@ -29,4 +29,19 @@ configurations are preferred.
The `org.springframework.build.test-sources` updates `testCompile` dependencies to include
the test source sets of `project()` dependencies. This plugin is used in the Spring Framework build
-to share test utilities and fixtures amongst modules.
\ No newline at end of file
+to share test utilities and fixtures amongst modules.
+
+## API Diff
+
+This plugin uses the [Gradle JApiCmp](https://github.com/melix/japicmp-gradle-plugin) plugin
+to generate API Diff reports for each Spring Framework module. This plugin is applied once on the root
+project and create tasks in each framework module. Unlike previous versions of this part of the build,
+there is no need for checking out a specific tag. The plugin will fetch the JARs we want to compare the
+current working version with. You can generate the reports for all modules or a single module:
+
+```
+./gradlew apiDiff -PbaselineVersion=5.1.0.RELEASE
+./gradlew :spring-core:apiDiff -PbaselineVersion=5.1.0.RELEASE
+```
+
+The reports are located under `build/reports/api-diff/$OLDVERSION_to_$NEWVERSION/`.
\ No newline at end of file
diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle
index 51631d39c3..09a31a0123 100644
--- a/buildSrc/build.gradle
+++ b/buildSrc/build.gradle
@@ -4,10 +4,20 @@ plugins {
repositories {
mavenCentral()
+ gradlePluginPortal()
+}
+
+dependencies {
+ implementation "me.champeau.gradle:japicmp-gradle-plugin:0.2.8"
+
}
gradlePlugin {
plugins {
+ apiDiffPlugin {
+ id = "org.springframework.build.api-diff"
+ implementationClass = "org.springframework.build.api.ApiDiffPlugin"
+ }
compileConventionsPlugin {
id = "org.springframework.build.compile"
implementationClass = "org.springframework.build.compile.CompilerConventionsPlugin"
diff --git a/buildSrc/src/main/java/org/springframework/build/api/ApiDiffPlugin.java b/buildSrc/src/main/java/org/springframework/build/api/ApiDiffPlugin.java
new file mode 100644
index 0000000000..0f281235ac
--- /dev/null
+++ b/buildSrc/src/main/java/org/springframework/build/api/ApiDiffPlugin.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2002-2019 the original author or authors.
+ *
+ * Licensed 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
+ *
+ * https://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.
+ */
+package org.springframework.build.api;
+
+import java.io.File;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Collections;
+import java.util.List;
+
+import me.champeau.gradle.japicmp.JapicmpPlugin;
+import me.champeau.gradle.japicmp.JapicmpTask;
+import org.gradle.api.Plugin;
+import org.gradle.api.Project;
+import org.gradle.api.artifacts.Configuration;
+import org.gradle.api.artifacts.Dependency;
+import org.gradle.api.plugins.JavaBasePlugin;
+import org.gradle.api.plugins.JavaPlugin;
+import org.gradle.api.tasks.TaskProvider;
+import org.gradle.jvm.tasks.Jar;
+
+/**
+ * {@link Plugin} that applies the {@code "japicmp-gradle-plugin"}
+ * and create tasks for all subprojects, diffing the public API one by one
+ * and creating the reports in {@code "build/reports/api-diff/$OLDVERSION_to_$NEWVERSION/"}.
+ *
{@code "./gradlew apiDiff -PbaselineVersion=5.1.0.RELEASE"} will output the
+ * reports for the API diff between the baseline version and the current one for all modules.
+ * You can limit the report to a single module with
+ * {@code "./gradlew :spring-core:apiDiff -PbaselineVersion=5.1.0.RELEASE"}.
+ *
+ * @author Brian Clozel
+ */
+public class ApiDiffPlugin implements Plugin {
+
+ public static final String TASK_NAME = "apiDiff";
+
+ private static final String BASELINE_VERSION_PROPERTY = "baselineVersion";
+
+ private static final List PACKAGE_INCLUDES = Collections.singletonList("org.springframework.*");
+
+ @Override
+ public void apply(Project project) {
+ if (project.hasProperty(BASELINE_VERSION_PROPERTY) && project.equals(project.getRootProject())) {
+ project.getPluginManager().apply(JapicmpPlugin.class);
+ project.getPlugins().withType(JapicmpPlugin.class,
+ plugin -> applyApiDiffConventions(project));
+ }
+ }
+
+ private void applyApiDiffConventions(Project project) {
+ String baselineVersion = project.property(BASELINE_VERSION_PROPERTY).toString();
+ project.subprojects(subProject -> createApiDiffTask(baselineVersion, subProject));
+ }
+
+ private void createApiDiffTask(String baselineVersion, Project project) {
+ if (isProjectEligible(project)) {
+ JapicmpTask apiDiff = project.getTasks().create(TASK_NAME, JapicmpTask.class);
+ apiDiff.setDescription("Generates an API diff report with japicmp");
+ apiDiff.setGroup(JavaBasePlugin.DOCUMENTATION_GROUP);
+
+ apiDiff.setOldClasspath(project.files(createBaselineConfiguration(baselineVersion, project)));
+ TaskProvider jar = project.getTasks().withType(Jar.class).named("jar");
+ apiDiff.setNewArchives(project.getLayout().files(jar.get().getArchiveFile().get().getAsFile()));
+ apiDiff.setNewClasspath(getRuntimeClassPath(project));
+ apiDiff.setPackageIncludes(PACKAGE_INCLUDES);
+ apiDiff.setOnlyModified(true);
+ apiDiff.setIgnoreMissingClasses(true);
+ // Ignore Kotlin metadata annotations since they contain
+ // illegal HTML characters and fail the report generation
+ apiDiff.setAnnotationExcludes(Collections.singletonList("@kotlin.Metadata"));
+
+ apiDiff.setHtmlOutputFile(getOutputFile(baselineVersion, project));
+
+ apiDiff.dependsOn(project.getTasks().getByName("jar"));
+ }
+ }
+
+ private boolean isProjectEligible(Project project) {
+ return project.getPlugins().hasPlugin(JavaPlugin.class)
+ && !project.getName().equals("spring-core-coroutines")
+ && !project.getName().equals("spring-framework-bom");
+ }
+
+ private Configuration createBaselineConfiguration(String baselineVersion, Project project) {
+ String baseline = String.join(":",
+ project.getGroup().toString(), project.getName(), baselineVersion);
+ Dependency baselineDependency = project.getDependencies().create(baseline + "@jar");
+ return project.getRootProject().getConfigurations().detachedConfiguration(baselineDependency);
+ }
+
+ private Configuration getRuntimeClassPath(Project project) {
+ return project.getConfigurations().getByName(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME);
+ }
+
+ private File getOutputFile(String baseLineVersion, Project project) {
+ Path outDir = Paths.get(project.getRootProject().getBuildDir().getAbsolutePath(),
+ "reports", "api-diff",
+ baseLineVersion + "_to_" + project.getRootProject().getVersion());
+ return project.file(outDir.resolve(project.getName() + ".html").toString());
+ }
+
+}
\ No newline at end of file
diff --git a/gradle/jdiff.gradle b/gradle/jdiff.gradle
deleted file mode 100644
index da454e62ab..0000000000
--- a/gradle/jdiff.gradle
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * Generate a JDiff report between the current version and an older version.
- *
- * Usage:
- * gradle jdiff -D OLD_VERSION=3.1.3.RELEASE -D OLD_VERSION_ROOT=/path/to/3.1.3.RELEASE
- *
- * View generated report at:
- * build/reports/jdiff/changes.html
- *
- * @param OLD_VERSION required
- * @param OLD_VERSION_ROOT required, typically pointing to a separate git clone dir
- */
-task jdiff {
- description = "Generates a JDiff report"
- group = "Documentation"
-
- def jdiffHome = "${rootProject.rootDir}/gradle/jdiff"
-
- ant.taskdef(
- name: "jdiff",
- classname: "jdiff.JDiffAntTask",
- classpath: "${jdiffHome}/antjdiff.jar")
-
- def currentVersion = rootProject.version
- def currentVersionRoot = rootProject.rootDir
-
- def oldVersion = System.getProperty("OLD_VERSION")
- def oldVersionRoot = System.getProperty("OLD_VERSION_ROOT")
-
- def outputDir = "${rootProject.buildDir}/reports/jdiff/${oldVersion}_to_${currentVersion}"
-
- doLast {
- if (oldVersion == null)
- throw new IllegalArgumentException(
- "Set OLD_VERSION property to indicate older of the two versions being compared")
- if (oldVersionRoot == null)
- throw new IllegalArgumentException(
- "Set OLD_VERSION_ROOT property to indicate the root directory for ${oldVersion}")
-
- oldVersionRoot = new File(oldVersionRoot)
-
- ant.property(name: "JDIFF_HOME", value: jdiffHome)
- ant.mkdir(dir: outputDir)
- ant.jdiff(
- destdir: outputDir,
- source: "1.8",
- verbose: "off",
- stats: "on",
- docchanges: "off") {
- old(name: "Spring Framework ${oldVersion}") {
- oldVersionRoot.eachDirMatch( {
- def candidate = new File(it)
- candidate.name.matches("org.springframework.*") ||
- candidate.name.matches("spring-.*") }) { match ->
- match.eachDirRecurse { subdir ->
- if (subdir.path ==~ '.*/src/main/java$') {
- dirset(dir: subdir.path, includes: "org/**")
- }
- }
- }
- }
- "new"(name: "Spring Framework ${currentVersion}") {
- currentVersionRoot.eachDirMatch( {
- def candidate = new File(it)
- candidate.name.matches("org.springframework.*") ||
- candidate.name.matches("spring-.*") }) { match ->
- match.eachDirRecurse { subdir ->
- if (subdir.path ==~ '.*/src/main/java$') {
- dirset(dir: subdir.path, includes: "org/**")
- }
- }
- }
- }
- }
- }
-}
diff --git a/gradle/jdiff/LICENSE.txt b/gradle/jdiff/LICENSE.txt
deleted file mode 100644
index fab48ede1c..0000000000
--- a/gradle/jdiff/LICENSE.txt
+++ /dev/null
@@ -1,506 +0,0 @@
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-not price. Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
-
- Copyright (C)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- , 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
-
-
-
-
diff --git a/gradle/jdiff/Null.java b/gradle/jdiff/Null.java
deleted file mode 100644
index 2d8649e544..0000000000
--- a/gradle/jdiff/Null.java
+++ /dev/null
@@ -1,9 +0,0 @@
-/**
- * This class is used only as a "null" argument for Javadoc when comparing
- * two API files. Javadoc has to have a package, .java or .class file as an
- * argument, even though JDiff doesn't use it.
- */
-public class Null {
- public Null() {
- }
-}
diff --git a/gradle/jdiff/README-SPRING.txt b/gradle/jdiff/README-SPRING.txt
deleted file mode 100644
index 430f2bffec..0000000000
--- a/gradle/jdiff/README-SPRING.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-This distribution of JDiff 1.1.1 is included in the Spring Framework build
-because JDiff has a hard requirement on a JDIFF_HOME directory containing
-jdiff.jar and xerces.jar as well as other presentation resources.
-
-The actual generation of JDiff reports is driven by the `jdiff` task declared
-in build.gradle in the project root.
diff --git a/gradle/jdiff/README.txt b/gradle/jdiff/README.txt
deleted file mode 100644
index caa85c5302..0000000000
--- a/gradle/jdiff/README.txt
+++ /dev/null
@@ -1,59 +0,0 @@
-
- JDiff Doclet
- ------------
-
- Matthew Doar
- mdoar@pobox.com
-
-
-The JDiff doclet is used to generate a report describing the
-difference between two public Java APIs.
-
-The file jdiff.html contains the reference page for JDiff. The latest
-version of JDiff can be downloaded at:
-https://sourceforge.net/projects/javadiff
-
-To use the Ant task on your own project, see example.xml. More examples
-of using JDiff to compare the public APIs of J2SE1.3 and J2SE1.4 can
-be seen at http://javadiff.sourceforge.net/
-
-For an example with the source distribution, run "ant" and
-look at the HTML output in ./build/reports/example/changes.html
-The page at ./build/reports/example/changes/com.acme.sp.SPImpl.html
-shows what a typical page of changes looks like.
-
-System Requirements
--------------------
-
-JDiff has been tested with all releases of Java since J2SE1.2 but
-releases of JDiff after 1.10.0 focus on JDK1.5.
-
-License
--------
-
-JDiff is licensed under the Lesser GNU General Public License (LGPL).
-See the file LICENSE.txt.
-
-Acknowledgements
-----------------
-
-JDiff uses Stuart D. Gathman's Java translation of Gene Myers' O(ND)
-difference algorithm.
-
-JDiff uses Xerces 1.4.2 from https://www.apache.org.
-
-JDiff also includes a script to use the classdoc application from
-http://classdoc.sourceforge.net or http://www.jensgulden.de, by Jens
-Gulden, (mail@jensgulden.de), to call a doclet such as jdiff on a .jar
-file rather than on source.
-
-Many thanks to the reviewers at Sun and Vitria who gave feedback on early
-versions of JDiff output, and also to the distillers of Laphroaig, and to
-Arturo Fuente for his consistently fine cigars which helped inspire
-much of this work.
-
-
-Footnote:
-
-If you are looking for a generalized diff tool for XML, try diffmk from
-https://wwws.sun.com/software/xml/developers/diffmk/
diff --git a/gradle/jdiff/antjdiff.jar b/gradle/jdiff/antjdiff.jar
deleted file mode 100644
index 063dbee960..0000000000
Binary files a/gradle/jdiff/antjdiff.jar and /dev/null differ
diff --git a/gradle/jdiff/background.gif b/gradle/jdiff/background.gif
deleted file mode 100644
index e6d2dda389..0000000000
Binary files a/gradle/jdiff/background.gif and /dev/null differ
diff --git a/gradle/jdiff/black.gif b/gradle/jdiff/black.gif
deleted file mode 100644
index 185d95b110..0000000000
Binary files a/gradle/jdiff/black.gif and /dev/null differ
diff --git a/gradle/jdiff/jdiff.html b/gradle/jdiff/jdiff.html
deleted file mode 100644
index d242fb8a49..0000000000
--- a/gradle/jdiff/jdiff.html
+++ /dev/null
@@ -1,1032 +0,0 @@
-
-
-
-
-JDiff User Documentation
-
-
-
-
-
- |
-  |
-
-
-
-
-
-JDiff User Documentation
-
-
-
-JDiff is a Javadoc doclet which generates an
-HTML report of all the packages, classes, constructors, methods, and
-fields which have been removed, added or changed in any way, including
-their documentation, when two APIs are compared. This is very useful
-for describing exactly what has changed between two releases of a
-product. Only the API (Application Programming Interface) of each
-version is compared. It does not compare what the source code does
-when executed.
-
-
-
-CONTENTS
-
-
-
-
-OVERVIEW
-
-
-The basic sequence of operations is to run JDiff on one set of source
-files to create an XML file which represents the API for that version
-of a product. Then JDiff is run again on another set of source files
-to create an XML file which represents the API for the next version of
-a product. Finally, JDiff compares the two APIs as represented in the
-XML files and generates an HTML report which describes the differences
-between the two APIs, together with comments describing the reasons
-for the differences. This whole process can be executed as separate
-Javadoc steps (either from Ant or the command line) or by simply using
-the Ant JDiff task provided.
-
-
-
-The results are written into a file called changes.html,
-with more files in a subdirectory called changes. These
-files can contain links to existing Javadoc documentation. A CSS
-stylesheet is also generated in the file
-stylesheet-jdiff.css, and this uses a background image in
-background.gif. These are the only files which usually
-need to be shipped with a product to include a report of what has
-changed since the previous release. If the -stats
-option was used, then the file black.gif should also be
-shipped.
-
-
-
-There is a working example of how to use JDiff in the examples
-directory of the source distribution.
-
-
-
-
-
-INSTALLATION
-
-
-Unpack the jdiff-1.1.1.zip file. This will produce a directory named
-"jdiff-1.1.1" containing all that is necessary to use JDiff to produce
-your own reports. See the file "example.xml" in that directory for an
-example of how to use the Ant JDiff task. The file "jdiff.html"
-contains more information about using JDiff.
-
-
-
-If you are using the complete source distribution, then you should be
-able to simply type "ant" at the top-level to produce a working
-example report.
-
-
-
-The Ant JDiff task needs Ant 1.6.1 to work correctly. Using Ant
-1.5 will produce the error:
-
-Error: two projects are needed, one <old> and one <new>
-
-
-
-
-No Windows registry entries are changed by JDiff. To remove JDiff,
-simply delete the directory where it is was unpacked.
-
-
-
-
-SYNOPSIS
-
-
-The Ant JDiff task has the following parameters:
-
-
-
-
-
- | Attribute |
- Description |
- Required |
-
-
-
- | destdir |
- The location where the JDiff report will be generated. Defaults to a directory "jdiff_report" in the directory from where Ant was executed. |
- No |
-
-
-
- | stats |
- Generate an HTML page of statistical information about the
- differences between the two APIs. Defaults to "off". |
- No |
-
-
-
- | docchanges |
- Enables comparison of Javadoc documentation. Defaults to "off". |
- No |
-
-
-
- | verbose |
- Increase the logging vebosity of the task. Defaults to "off". |
- No |
-
-
-
-
-
-Parameters specified as nested elements
-
-
-
-The old and new elements are used to describe the projects to be compared.
-
-
-
-
-
- | Attribute |
- Description |
- Required |
-
-
-
- | name |
- The name of the project, e.g. "My Project Version 1". The name, with spaces replaced by underscores, is used as the name of the XML file in destdir,
-which is generated by JDiff to represent the structure of the source files of this project. |
- Yes |
-
-
-
- | javadoc |
- The location of a Javadoc report for this project. If this attribute is not used, then a Javadoc report for the project will be generated in a subdirectory named name in destdir. |
- No |
-
-
-
-
-
-
-Note: the old and new elements only have DirSet nested elements, not FileSet ones.
-
-
-
-The complete list parameters that can be passed to the JDiff doclet,
-either through the Ant Javadoc task or directly at the command line,
-is as follows:
-
-
-
-javadoc -doclet jdiff.JDiff -docletpath jdiff.jar
- [-apiname <API name>]
- [-apidir <optional directory where the API XML file is to be placed>]
- [-oldapi <name of old API>]
- [-oldapidir <optional directory where the old API XML file is located>]
- [-newapi <name of new API>]
- [-newapidir <optional directory where the new API XML file is located>]
- [-sourcepath <source path>]
- [-javadocnew <javadoc files location for the new API>]
- [-javadocold <javadoc files location for the old API>]
- [-baseURI <base>]
- [-excludeclass <exclusion level>]
- [-excludemember <exclusion level>]
- [-nosuggest <suggestion level>]
- [-firstsentence]
- [-docchanges]
- [-checkcomments]
- [-packagesonly]
- [-showallchanges]
- [-retainnonprinting]
- [-excludetag <exclude tag>]
- [-stats]
- [-windowtitle <text>]
- [-doctitle <HTML text>]
- [-version]
- [-help]
-
-
-
-NOTE: Either -apiname, or both -oldapi and
--newapi must be used. All other arguments are optional.
-
-
-
-The -d directory argument works just as with Javadoc, redirecting
-the HTML output to the given directory.
-
-
-The arguments for the JDiff doclet are:
-
- -
-
-apiname <API name>
- -
- Define the name which will be associated
- with the specified API. If the name which is given here has space
- characters, they will be
- replaced by underscore characters. This name with no spaces is used as the name of the XML
- file. It is also written into the XML file as an attribute of the top
- element.
- E.g. "SuperProduct 1.0" generates an XML file named
- "SuperProduct_1.0.xml".
- The XML file is always generated in the current directory, unless
- overridden by the
-apidir argument.
-
-
- -
-
-oldapi <name of old API>
- -
- The name of the old or previous version of an
- API or product, e.g. "SuperProduct 1.0", which is to be one of the
- APIs compared.
- This name is the name which was given to
-apiname when
- the XML file was generated.
-
-
- -
-
-newapi <name of old API>
- -
- The name of the new or later version of an
- API or product, e.g. "SuperProduct 2.0", which is to be one of the
- APIs compared.
- This name is the name which was given to
-apiname when
- the XML file was generated.
-
-
- -
-
-apidir <API directory>
- -
- Defines the directory where the API XML file is to be placed. Used in
- conjunction with the
-apiname argument.
-
-
- -
-
-oldapidir <old API directory>
- -
- Defines the directory where the XML file for the old API is located.
- Used in conjunction with the
-oldapi argument. Default is the current
- directory.
-
-
- -
-
-newapidir <new API directory>
- -
- Defines the directory where the XML file for the new API is located.
- Used in conjunction with the
-newapi argument. Default is the current
- directory.
-
-
- -
-
-sourcepath <source path>
- -
- Define the path to the set of Java source
- files (the API)
- to be scanned, e.g.
examples/SuperProduct1.0. The
- slashes in this argument should match the local architecture.
-
-
- -
-
-javadocnew <javadoc files location for the new API>
- -
- The location of existing Javadoc files
- for the new API, e.g. "https://java.sun.com/j2se/1.5.0/docs/api/" for the
- public documentation for J2SE1.5.0. The default value is "../", which implies
- that the documentation directory generated by Javadoc is at the same level as
- the "changes.html" file generated by JDiff. Slashes are always
- forward in the argument, since this is an HTML link. The argument
- should also always end in a forward slash. If a relative value is
- given, it should be relative to files in the "changes" directory
- generated by JDiff.
-
-
- -
-
-javadocold <javadoc files location for the old API>
- - The location of existing
- Javadoc files for the old API, e.g. "https://java.sun.com/j2se/1.5.0/docs/API/"
- for the public documentation for J2SE1.5.0. The default value is null, which
- results in no links to Javadoc-generated documentation for the previous
- release. Slashes are always forward in the argument, since this is an HTML
- link. The argument should also always end in a forward slash. If a relative
- value is given, it should be relative to files in the "changes" directory
- generated by JDiff.
-
-
- -
-
-
-baseURI <base>
- -
- Use \"base\" as the base location of the various DTDs used by
- JDiff. For example,
-baseURI "file:///C:/jdiff/lib" would cause
- the XML parser to use the copies which are shipped in the
- lib directory, if JDiff is installed in
- C:\jdiff. Note that there are three forward slashes
- after "file:".
-
-
- -
-
-excludeclass <exclusion level>
- -
- This can be set to "public",
- "protected", "package", or "private". If it is set to "protected", only
- classes which are public or protected will be shown. If it is set to
- "public", then only public classes are shown. The default is
- "protected". If this is changed, the Javadoc
-private
- argument must also be passed to Javadoc.
-
-
- -
-
-excludemember <exclusion level>
- -
- This can be set to "public",
- "protected", "package", or "private". If it is set to "protected", only
- members (constructors, methods and fields) which are public or protected will be shown. If it is set to
- "public", then only public members are shown. The default is
- "protected".
- If this is changed, the Javadoc
-private
- argument must also be passed to Javadoc.
-
-
- -
-
-firstsentence
- -
- This argument causes JDiff to save only the first sentence of each
- Javadoc comment as part of
- the API. This is only necessary when the XML file representing the
- API is being generated. See
-docchanges for how to
- note documentation changes as differences.
-
-
- -
-
-docchanges
- -
- This argument enables comparison of Javadoc documentation.
- By default, changes in the saved Javadoc documentation
- are not noted as changes (or as removals and related
- additions). See
-firstsentence option for how to compare just
- the first sentence in Javadoc documentation.
-
-
- -
-
-nosuggest <suggestion level>
- -
- This can be set to "all", "remove", "add",
- or "change". The effect of setting this to "all" is to stop comments
- for any changes at all being suggested. Any comments which are to
- appear in the report must then be written by the user (see below).
- If it is set to "change", then
- comments will not be suggested for changes, but will be suggested for
- removals and additions. The default is that comments are suggested for
- all possible places.
-
-
- -
-
-checkcomments
- -
- If this argument is used, JDiff
- will warn the user when the report is generated if there are comments
- which do not end in a period, question mark or exclamation mark.
-
-
- -
-
-packagesonly
- -
- If this argument is used, JDiff
- will not scan classes specified on the command line. This should
- only need to be used with the "jdiffjar" script, when
- comparing Jar files.
- If this options is not used when comparing Jar files, duplicate
- classes with no packages ("anonymous" classes) may be
- wrongly reported by JDiff.
-
-
- -
-
-showallchanges
- -
- If this argument is used, JDiff will show changes in
- native and synchronized modifiers. See here for why these are not shown by default.
-
-
- -
-
-retainnonprinting
- -
- Retain non-printable characters
- in comments. By default, JDiff removes non-printable characters
- from comments which it uses.
- This should only really be necessary if the first line of a
- comment has used explicit Unicode character escape sequences which
- cannot be printed, or more importantly for JDiff, read in from XML.
- If this option is used, JDiff may fail to read in an XML
- file, and exit with an error message about "an invalid XML character (Unicode:
- 0x....)" on a certain line in the file. Turning off this option does
- make creating large XML files a little faster.
-
-
- -
-
-excludetag <exclude tag>
- -
- The argument passed in with this causes
- JDiff to ignore program elements (packages, classes, constructors,
- methods, fields) which contain the given exclude tag in their comment blocks,
- e.g. " @exclude", " @docset Internal". The extra space in front of "@" is
- to stop Javadoc from expanding the name into a file containing commands on
- the compile line. White space is trimmed off before the string is used.
-
- Another solution to passing "@" as part of an argument is to pass @foo,
- and then create a file named
foo, containing
- -excludetag @exclude.
-
-
-
- -
-
-stats
- -
- Generate an HTML page of statistical information about the
- differences between the two APIs.
-
-
- -
-
-windowtitle <text>
- -
- Specify the title used in the browser window for the report.
- By default, this is
- "API Differences Between <name of old API> and
- <name of new API>".
-
-
- -
-
-doctitle <HTML text>
- -
- Specify the title used on the first page of the report.
- By default, this is
- "API Differences Between <name of old API> and
- <name of new API>".
-
-
- -
-
-version
- -
- Display the version of JDiff.
-
-
- -
-
-help
- -
- Display the usage summary for JDiff.
-
-
-
-
-
-OUTPUT
-
-
-
-- Interfaces appear in italics, just as in Javadoc documentation.
-- When a package or class appears in bold, it has been added in
-the new version or API.
-- When a package or class appears
struck through, it has been removed in
-the new version or API.
-- When a constructor is added, two entries are added to the "All
-Differences" index: one for the addition of a new constructor, and
-one for the change of the class. The constructor entry has
-"constructor" after it.
-- There are some complex changes which can occur between versions, for example, when two or more methods with the same name change simultaneously, or when a method or field is moved into or from a superclass.
-In these cases, the change will be seen as a removal and an addition, rather than as a change. Unexpected removals or additions are often part of one of these type of changes.
-- With large packages, it is often necessary to change the memory parameters for
-Javadoc, e.g. pass in
-J-Xmx128m to Javadoc.
-- The
api.xsd template describes the format of the XML
-for the APIs, and the comments.xsd template describes the format
-of the XML for the comments. The API template is independent of any
-related work at Sun, but the intention is to adopt whatever becomes
-the de facto standard in the future, whilst retaining backward
-compatibility. To enable validation, set the boolean validateXML in
-the file XMLToAPI.java and recompile.
-- Comments in the comments XML file do get reordered during
-regeneration. This is harmless.
-
-
-
-
-
-ADDING COMMENTS TO A REPORT
-
-
-Comments can be added to a report by using a text editor to add text
-to the "user_comments_X_to_Y.xml" file, where "X" and "Y" are the
-names of the two APIs being compared. This file is automatically regenerated
-each time the report is generated.
-If the -d directory argument is used, the user comments XML
-file also appears, and is expected, in the named directory.
-
-Comments which become unused are
-moved to the end of the file and placed inside XML comments.
-
-
- The text which is added can be HTML text if necessary, but if the
- HTML is incorrect, JDiff may fail to read the comments file and exit. Note that
- the required HTML is in fact XHTML. Since this HTML is stored in an XML document, single tags without their closing ("slash") element are not permitted.
- For example, most browsers permit HTML which looks like "<p>Here is some
- text.", with no closing tag. XML requires that either a closing tag exists ("</p>"),
- or that the single tag is closed, e.g. "<p/>Here is some text.".
-HTML p, br and hr tags can be single, due to common usage.
-
-
-
-To write comments for a particular removal, addition or change in the
-JDiff-generated report, edit the comments XML file. Your changes will
-be automatically incorporated into a new version of this file when the
-report is next generated. Search the file for the identifier for the
-particular removal, addition or change, using the package name, class
-name and member name to find the identifier. Alternatively, look at
-the HTML source of a report and note the identifier (an HTML named anchor)
-near the intended place for the comment.
-
-
-
-Adding links to comments can be accomplished in two ways: with the {@link} Javadoc tag, or by using HTML links directly.
-
-
-
--
-To link to a class, use the package and class name, e.g. {@link
-packagename.classname}.
-
-
--
-To link to a specific method in a class' HTML page, use the package,
-class name, a pound sign, and then the method and parameters, or ()
-e.g. {@link packagename.classname#methodname(params)}.
-
-
--
-To link to a specific constructor in a class' HTML page, use the package,
-class name, a pound sign, and then the classname and parameters, or ()
-e.g. {@link packagename.classname#classname(params)}.
-
-
--
-To link to a specific field in a class' HTML page, use the package,
-class name, a pound sign, and then the name of the field
-e.g. {@link packagename.classname#fieldname}.
-
-
-
-
-Alternatively, you can use an explicit HTML
-<a> element. e.g.
-<a href="packagename.classname.html#methodname">link text<a>.
-The specific HTML named anchor can be found by looking at the HTML
-source of a report.
-
-
-
-Sometimes you may want to have the same comment text appear in
-multiple places in the report. You can do this by having multiple
-<identifier> elements in a single <comment> element. This
-grouping does not persist after the comments file is regenerated.
-
-
-
-The first sentence from a comment in the source code for an element is
-available in the comments XML file by using the @first tag. This tag
-will be replaced (once) in the comments in the report by the first
-sentence from the appropriate Javadoc comment.
-
-
-
-
-TROUBLESHOOTING
-
-
-
- | PROBLEM |
- POSSIBLE SOLUTION |
-
-
-
- Error: two projects are needed, one
-<old> and one <new> |
- The Ant JDiff task needs Ant 1.6.1 to work correctly |
-
-
-
- | You are not connected to the Internet, or are behind a firewall |
- See the documentation for how to use
- the -baseURI
- optionThis only applies to generating JDiff output,
- not to viewing it. |
-
-
-
- | No changes are seen in the report. |
- By default, Javadoc and JDiff only show public
- and protected classes and members. |
-
-
-
- | No changes seen for package and private classes. |
- Enable both the correct Javadoc visibility level
- (-public, -protected, -package, -private) and the correct JDiff
- visibility level (-excludeclass, -excludemember). |
-
-
-
- | No comments were inserted for packages. |
- You need to use the -sourcepath argument to
- locate the source code files, so that
- JDiff can deduce where the package.html file with
- comments about the package may be. If no package.html
- file exists or can be found, then no comments can be suggested
- for packages. Of course, comments can still be
- added by hand. |
-
-
-
- JDiff takes a long time to load XML, or throws
- java.net.NoRouteToHostException: Operation timed out. |
- The validation portion of loading the XML file
- currently requires the ability to make an HTTP connection. Check
- your network and try again, or see the -baseURI
- option and the next suggestion. |
-
-
-
- | From behind a firewall,
-
- JDiff fails to load one of the required XML DTD files. |
- Use the following settings to tell the Java2 VM
- that you are behind a firewall:
- java -DproxySet=true -DproxyHost=PROXYSERVER -DproxyPort=PORT
- where PROXYSERVER is the hostname or IP address of
- your proxy server, and PORT is the port number of the
- proxy server.
- The other alternative is to use the local copies of the required
- files by using the option -baseURI when generating the API XML
- files. For example, -baseURI "file:///C:/jdiff/lib" would cause
- the XML parser to use the copies which are shipped in the
- lib directory, if JDiff is installed in
- C:\jdiff. Note that there are three forward slashes
- after "file:".
- The -baseURI approach has the advantage that it
- requires no connectivity to the Internet to be able to run JDiff.
- |
-
-
-
- JDiff fails to handle assert in J2SE1.4 |
- Be sure to use the -source 1.4 argument to
- Javadoc to handle assertions present in J2SE1.4 source code.
- |
-
-
-
- | Using an XML parser other than Xerces |
- Set the org.xml.sax.driver system property to
- the name of the XML parser class which you wish to use. Setting a system
- property is usually done by passing -Dname=value to the JVM.
- To cause Javadoc to pass an argument to the underlying JVM, use
- -J-Dname=value. To pass an argument to Javadoc from within
- an ANT Javadoc task, use the additionalparam attribute, e.g.
- additionalparam="-J-Dorg.xml.sax.driver=com.example.my.driver"
- |
-
-
-
- | Comparing Jar files results in duplicate class
- changes being reported. |
- Be sure to use the -packagesonly
- option when using Jar files as the input to JDiff. You should not
- need to use -packagesonly otherwise.
- |
-
-
-
- | Documentation difference page becomes all changes
- part way through. |
- This problem can occur if incorrect HTML is
- written in the new documentation. JDiff shows this HTML on the
- documentation difference page, and can cause entries later on in
- the page to be displayed incorrectly.
-
- One solution is to edit the documentation difference page by
- hand, but the better solution is to fix the offending HTML in the
- new source code.
- |
-
-
-
- | The background color of my HTML report is not correct. |
- Check that the file background.gif from the lib is in the same directory as the changes.html file.
- |
-
-
-
- | The names of exceptions are too long in the HTML report. |
- To use short names for exceptions, set the
- showExceptionTypes boolean to false in
- XMLToAPI.java file and recompile.
- |
-
-
-
-
-
-
-
-ERRORS AND WARNING MESSAGES
-
-
-The warnings and error messages which can be generated by JDiff are as
-follows:
-
-
-
-
-
- | ERROR MESSAGE |
- POSSIBLE CAUSE |
-
-
- | Error: unknown element type. |
- The XML file contains an element tag which the
- current version of JDiff cannot recognize. This may occur if an
- older version of JDiff is used with XML files generated by a newer
- version. |
-
-
- | Error: IO Error while attempting to create X. |
- Java was unable to open a file for writing. May
- occur if the user does not have write permission for the current
- directory. |
-
-
- | Error: no identifier found in the comments XML file. |
- The XML file for the comments for the report must
- contain an identifier to indicate which report of differing APIs
- these comments are written for. |
-
-
- | Error: unknown program element type. |
- Internal JDiff error. |
-
-
- | Error: could not create the subdirectory X. |
- Java was unable to create a directory. May
- occur if the user does not have write or execute permission for the current
- directory. |
-
-
- | Error: file X does not exist for the [old|new] API. |
- The XML files corresponding to the names given to
- -oldapi and -newapi are not in the
- current directory. This may be because the XML files have not yet been
- generated, or were generated elsewhere.
- It can also occur if the
- XML file was generated with one API identifier, and is now being
- read in with another identifier. Either use the same identifier,
- or change the <api> name element value in the XML file to the new
- API identifier. |
-
-
- | Error: no API identifier found in the XML file X. |
- The given XML file does not have an identifier in
- it, probably due to manual modification. |
-
-
- | Error: no packages found in the APIs. |
- JDiff was unable to find any packages in the
- arguments given to Javadoc. |
-
-
-
-
-
-
-
- | WARNING MESSAGE |
- POSSIBLE CAUSE |
-
-
- | Warning: illegal string found in text. Ignoring the comment. |
- The suggested comments from Javadoc are stored in
- XML files in a CDATA element, which permits every string except . |
-
-
- | Warning: no difference between the APIs. |
- There was no difference between the APIs. You are
- probably comparing two identical XML files. |
-
-
- | Warning: no classes found in the package X. |
- A package without classes was encountered. |
-
-
- | Warning: change from deprecated to undeprecated for class X. |
- A class changed from being deprecated to being
- undeprecated in the next release. This is usually either poor
- software design or a misplaced @deprecated Javadoc tag. |
-
-
- | Warning: change from deprecated to undeprecated
- for a constructor in class X. |
- A constructor changed from being deprecated to being
- undeprecated in the next release. This is usually either poor
- software design or a misplaced @deprecated Javadoc tag. |
-
-
- | Warning: change from deprecated to undeprecated for method X. |
- A method changed from being deprecated to being
- undeprecated in the next release. This is usually either poor
- software design or a misplaced @deprecated Javadoc tag. |
-
-
- | Warning: text of comment does not end in a period. |
- Generated when the -checkcomments is
- used. The suggested comment does not end in a period, question mark or exclamation mark. |
-
-
- | Warning: N identical ids in the existing comments file. Using the first instance. |
- The comments file contains comment for multiple
- places in the report, but N of the identifiers for the comment
- are non-unique. |
-
-
- | Warning: incorrectly formatted @link in text. |
- JDiff was unable to parse the @link in the
- suggested comment. |
-
-
- | Warning: comment com.acme.sp is no longer used. |
- The comment in the comments file intended for the
- given element is no longer needed, since the element is no longer
- part of the changes between the APIs. The comment will be moved to
- the end of the comments file and preserved, but not used. |
-
-
- | Warning: API identifier in the comments XML file differs from the name of the file. |
- The comments file keeps track of which APIs it is
- to be used for, and has detected a mismatch with the names of the
- current APIs. |
-
-
- | Warning: multiple @deprecated tags found in comments for X. Using the first one only. |
- A comment with more than one @deprecated tag was
- encountered in the source code. This is considered poor Javadoc style. |
-
-
- | Warning: @ tag seen in comment. |
- An @ tag other than @link has somehow made its
- way into a suggested comment. This should not occur, but can be
- remedied by editing the comments file to use a different comment. |
-
-
- | Warning: duplicate class : X found. Using the first instance only. |
- Multiple instances of the same fully qualified
- class name were found in the API XML file. Most likely caused by
- manual modification of the file after it was generated. |
-
-
- | Warning: missing @since tag |
- A class, constructor, method or field was added
- in the later API but no @since tag was found in the Javadoc
- comment. This information is logged into a file
- missingSinces.txt in the same directory as
- changes.html. This file is informational only. The
- boolean to control this behaviour is in the source file
- HTMLIndexes.java.
- |
-
-
- | Warning: API identifier in the XML file X differs from the name of the file Y. |
- The name given to -apiname when the XML file
- is generated is embedded in the XML file as a top-level attribute. This
- warning suggests that the XML file has been modified by hand, but that
- report generation should proceed using the new API identifier. |
-
-
-
-
-
-
-DIFFERENCE STATISTICS
-
-During the generation of a report, JDiff also reports a percentage
-difference between the two APIs being compared, e.g. "Approximately
-10% difference between the APIs". This statistic is calculated in the
-following way:
-
-
-Percentage change = 100 * (added + removed + 2*changed)
- -----------------------------------
- sum of public elements in BOTH APIs
-
-
-So if there are 15 packages in the old API, and 2 of these are removed,
-and 17 packages in the new API, 1 of which is newly added, and only 3
-of which have changed, then the simple percentage difference would be:
-
-
-100 * (1 + 2 + 2*3)/ (15 + 17) = 28%
-
-
-A change of 100% means that there are no packages in common between
-the two APIs. A change of 0% indicates that nothing changed between
-the two APIs. This formula is applied recursively in JDiff for classes
-and their members. That is, the value for the number of packages
-changed is not an integer, but instead is the value obtained by
-applying the same formula to the all the classes in the changed
-packages, and then to all the members of the changed classes.
- This results in a lower, but more accurate, percentage difference.
-The percentage difference value does not appear anywhere in the HTML
-report files generated by JDiff.
-The test suite for JDiff v1.0 had a difference value of approximately 63%.
-A real-world value is the value for the differences between J2SE1.2 and
-J2SE1.3, which is approximately 8%.
-
-
-
-
-LIMITATIONS
-
-
-- While Java is highly backward compatible, so that, for example,
- the XML for a
-J2SE1.2 application can be generated using JDiff with J2SE1.3, there
-are a few cases where classes will appear in the XML of the API which are
-not present in the source code. These classes appear to be inserted by
-
javac or javadoc. An example of this is the class
-java.awt.Robot, which is inserted into the XML for
-J2SE1.2 if javadoc in J2SE1.3 is used, but not does not appear in
- the XML if javadoc in J2SE1.2 is used.
-To avoid these (rare) cases, it is recommended that you use the same version
-of the J2SE that the application was written for.
-- JDiff does not tell you how two Javadoc web pages differ in layout, though
-it can tell you how the content has changed.
-Nor does it
-compare what the methods in an API do; if JDiff could tell you what had changed about the way two
-versions of an API execute, the Halting
-Problem would be solved, and our lives would be very different.
-- On a P3 450MHz machine, to scan all of the J2SE
Java
-and javax packages and generate XML takes about 2 minutes
-per version. To generate a report from the XML files takes about 30s
-
-
-
-
-
-FURTHER READING
-
-
-
-
-
-
-
-
-This software comes with absolutely NO WARRANTY. See the LGPL in the file LICENSE.txt for
-details.
-
-
-
-
-Copyright © 2001-2007 Matthew B. Doar
-
-
-
-
-
diff --git a/gradle/jdiff/jdiff.jar b/gradle/jdiff/jdiff.jar
deleted file mode 100644
index 5fc7ed0209..0000000000
Binary files a/gradle/jdiff/jdiff.jar and /dev/null differ
diff --git a/gradle/jdiff/jdiff_logo.gif b/gradle/jdiff/jdiff_logo.gif
deleted file mode 100644
index d098485d3a..0000000000
Binary files a/gradle/jdiff/jdiff_logo.gif and /dev/null differ
diff --git a/gradle/jdiff/new.gif b/gradle/jdiff/new.gif
deleted file mode 100644
index c0ef7a4744..0000000000
Binary files a/gradle/jdiff/new.gif and /dev/null differ
diff --git a/gradle/jdiff/xerces.jar b/gradle/jdiff/xerces.jar
deleted file mode 100644
index e75d486c8d..0000000000
Binary files a/gradle/jdiff/xerces.jar and /dev/null differ