Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -229,8 +229,7 @@ public Set<File> getJarsToScan() {
@TaskAction
public void runThirdPartyAudit() throws IOException {
Set<File> jars = getJarsToScan();

extractJars(jars);
Set<File> extractedJars = extractJars(jars);

final String forbiddenApisOutput = runForbiddenAPIsCli();

Expand All @@ -248,7 +247,7 @@ public void runThirdPartyAudit() throws IOException {

Set<String> jdkJarHellClasses = null;
if (this.jarHellEnabled) {
jdkJarHellClasses = runJdkJarHellCheck();
jdkJarHellClasses = runJdkJarHellCheck(extractedJars);
}

if (missingClassExcludes != null) {
Expand Down Expand Up @@ -302,16 +301,26 @@ private void logForbiddenAPIsOutput(String forbiddenApisOutput) {
getLogger().error("Forbidden APIs output:\n{}==end of forbidden APIs==", forbiddenApisOutput);
}

private void extractJars(Set<File> jars) {
/**
* Extract project jars to build directory as specified by getJarExpandDir.
* Handle multi release jars by keeping versions closest to `targetCompatibility` version.
* @param jars to extract to build dir
* @return File set of extracted jars
*/
private Set<File> extractJars(Set<File> jars) {
Set<File> extractedJars = new TreeSet<>();
File jarExpandDir = getJarExpandDir();
// We need to clean up to make sure old dependencies don't linger
getProject().delete(jarExpandDir);

jars.forEach(jar -> {
String jarPrefix = jar.getName().replace(".jar", "");
File jarSubDir = new File(jarExpandDir, jarPrefix);
extractedJars.add(jarSubDir);
FileTree jarFiles = getProject().zipTree(jar);
getProject().copy(spec -> {
spec.from(jarFiles);
spec.into(jarExpandDir);
spec.into(jarSubDir);
// exclude classes from multi release jars
spec.exclude("META-INF/versions/**");
});
Expand All @@ -330,14 +339,16 @@ private void extractJars(Set<File> jars) {
Integer.parseInt(targetCompatibility.get().getMajorVersion())
).forEach(majorVersion -> getProject().copy(spec -> {
spec.from(getProject().zipTree(jar));
spec.into(jarExpandDir);
spec.into(jarSubDir);
String metaInfPrefix = "META-INF/versions/" + majorVersion;
spec.include(metaInfPrefix + "/**");
// Drop the version specific prefix
spec.eachFile(details -> details.setPath(details.getPath().replace(metaInfPrefix, "")));
spec.setIncludeEmptyDirs(false);
}));
});

return extractedJars;
}

private void assertNoJarHell(Set<String> jdkJarHellClasses) {
Expand Down Expand Up @@ -399,7 +410,12 @@ private String runForbiddenAPIsCli() throws IOException {
return forbiddenApisOutput;
}

private Set<String> runJdkJarHellCheck() throws IOException {
/**
* Execute java with JDK_JAR_HELL_MAIN_CLASS against provided jars with OpenSearch core in the classpath.
* @param jars to scan for jarHell violations.
* @return standard out of jarHell process.
*/
private Set<String> runJdkJarHellCheck(Set<File> jars) throws IOException {
ByteArrayOutputStream standardOut = new ByteArrayOutputStream();
InjectedExecOps execOps = getProject().getObjects().newInstance(InjectedExecOps.class);
ExecResult execResult = execOps.getExecOps().javaexec(spec -> {
Expand All @@ -408,9 +424,8 @@ private Set<String> runJdkJarHellCheck() throws IOException {
getRuntimeConfiguration(),
getProject().getConfigurations().getByName(CompileOnlyResolvePlugin.RESOLVEABLE_COMPILE_ONLY_CONFIGURATION_NAME)
);

spec.getMainClass().set(JDK_JAR_HELL_MAIN_CLASS);
spec.args(getJarExpandDir());
spec.args(jars);
spec.setIgnoreExitValue(true);
if (javaHome != null) {
spec.setExecutable(javaHome + "/bin/java");
Expand Down