Skip to content

Commit a1495db

Browse files
authored
feat: add support for auxclasspathFromFile in java process (#243)
1 parent 9927611 commit a1495db

File tree

4 files changed

+89
-2
lines changed

4 files changed

+89
-2
lines changed

src/functionalTest/groovy/com/github/spotbugs/snom/StandardFunctionalTest.groovy

+42
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,48 @@ public class FooTest {
452452
!result.output.contains("Trying to add already registered factory")
453453
}
454454
455+
def "can apply plugin using useAuxclasspathFile flag"() {
456+
given:
457+
buildFile << """
458+
spotbugs {
459+
useAuxclasspathFile = true
460+
}
461+
dependencies {
462+
implementation 'com.google.guava:guava:19.0'
463+
}"""
464+
465+
File sourceDir = rootDir.toPath().resolve(Paths.get("src", "main", "java")).toFile()
466+
sourceDir.mkdirs()
467+
File sourceFile = new File(sourceDir, "MyFoo.java")
468+
sourceFile << """
469+
public class MyFoo {
470+
public static void main(String... args) {
471+
java.util.Map items = com.google.common.collect.ImmutableMap.of("coin", 3, "glass", 4, "pencil", 1);
472+
473+
items.entrySet()
474+
.stream()
475+
.forEach(System.out::println);
476+
}
477+
}
478+
"""
479+
480+
481+
when:
482+
BuildResult result =
483+
GradleRunner.create()
484+
.withProjectDir(rootDir)
485+
.withArguments("spotbugsMain", '--debug')
486+
.withPluginClasspath()
487+
.forwardOutput()
488+
.withGradleVersion(version)
489+
.build()
490+
491+
then:
492+
result.task(":spotbugsMain").outcome == TaskOutcome.SUCCESS
493+
result.output.contains("Using auxclasspath file")
494+
result.output.contains("/build/spotbugs/spotbugs-auxclasspath")
495+
}
496+
455497
@Unroll
456498
def 'shows report path when failures are found (Worker API? #isWorkerApi)'() {
457499
given:

src/main/groovy/com/github/spotbugs/snom/SpotBugsExtension.groovy

+4
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,9 @@ class SpotBugsExtension {
144144
@NonNull
145145
final Property<String> toolVersion
146146

147+
@NonNull
148+
final Property<Boolean> useAuxclasspathFile;
149+
147150
@Inject
148151
SpotBugsExtension(Project project, ObjectFactory objects) {
149152
ignoreFailures = objects.property(Boolean).convention(false);
@@ -173,6 +176,7 @@ class SpotBugsExtension {
173176
extraArgs = objects.listProperty(String);
174177
maxHeapSize = objects.property(String);
175178
toolVersion = objects.property(String)
179+
useAuxclasspathFile = objects.property(Boolean).convention(false)
176180
}
177181

178182
void setReportLevel(@Nullable String name) {

src/main/groovy/com/github/spotbugs/snom/SpotBugsTask.groovy

+11
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,15 @@ class SpotBugsTask extends DefaultTask implements VerificationTask {
229229
@PathSensitive(PathSensitivity.RELATIVE)
230230
FileCollection auxClassPaths;
231231

232+
/**
233+
* Property to enable auxclasspathFromFile and prevent Argument List Too Long issues in java processes.
234+
* Default value is {@code false}.
235+
*/
236+
@Input
237+
@Optional
238+
@NonNull
239+
final Property<Boolean> useAuxclasspathFile
240+
232241
private FileCollection classes;
233242

234243
void setClasses(FileCollection fileCollection) {
@@ -291,6 +300,7 @@ class SpotBugsTask extends DefaultTask implements VerificationTask {
291300
jvmArgs = objects.listProperty(String);
292301
extraArgs = objects.listProperty(String);
293302
maxHeapSize = objects.property(String);
303+
useAuxclasspathFile = objects.property(Boolean)
294304
}
295305

296306
/**
@@ -316,6 +326,7 @@ class SpotBugsTask extends DefaultTask implements VerificationTask {
316326
jvmArgs.convention(extension.jvmArgs)
317327
extraArgs.convention(extension.extraArgs)
318328
maxHeapSize.convention(extension.maxHeapSize)
329+
useAuxclasspathFile.convention(extension.useAuxclasspathFile)
319330
}
320331

321332
@TaskAction

src/main/groovy/com/github/spotbugs/snom/internal/SpotBugsRunner.java

+32-2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import java.io.IOException;
2121
import java.nio.charset.StandardCharsets;
2222
import java.nio.file.Files;
23+
import java.nio.file.Path;
24+
import java.nio.file.Paths;
2325
import java.nio.file.StandardOpenOption;
2426
import java.util.ArrayList;
2527
import java.util.Collection;
@@ -49,8 +51,15 @@ protected List<String> buildArguments(SpotBugsTask task) {
4951
args.add("-sortByClass");
5052
args.add("-timestampNow");
5153
if (!task.getAuxClassPaths().isEmpty()) {
52-
args.add("-auxclasspath");
53-
args.add(join(task.getAuxClassPaths().getFiles()));
54+
if (task.getUseAuxclasspathFile().get()) {
55+
args.add("-auxclasspathFromFile");
56+
String auxClasspathFile = createFileForAuxClasspath(task);
57+
log.debug("Using auxclasspath file: {}", auxClasspathFile);
58+
args.add(auxClasspathFile);
59+
} else {
60+
args.add("-auxclasspath");
61+
args.add(join(task.getAuxClassPaths().getFiles()));
62+
}
5463
}
5564
if (!task.getSourceDirs().isEmpty()) {
5665
args.add("-sourcepath");
@@ -108,6 +117,27 @@ protected List<String> buildArguments(SpotBugsTask task) {
108117
return args;
109118
}
110119

120+
private String createFileForAuxClasspath(SpotBugsTask task) {
121+
String auxClasspath =
122+
task.getAuxClassPaths().getFiles().stream()
123+
.map(File::getAbsolutePath)
124+
.collect(Collectors.joining("\n"));
125+
try {
126+
Path auxClasspathFile =
127+
Paths.get(
128+
task.getProject().getBuildDir().getAbsolutePath(),
129+
"spotbugs",
130+
"spotbugs-auxclasspath");
131+
Files.createDirectories(auxClasspathFile.getParent());
132+
Files.createFile(auxClasspathFile);
133+
Files.write(auxClasspathFile, auxClasspath.getBytes(), StandardOpenOption.TRUNCATE_EXISTING);
134+
return auxClasspathFile.normalize().toString();
135+
} catch (Exception e) {
136+
// oops
137+
throw new GradleException("Could not create auxiliary classpath file for SpotBugsTask");
138+
}
139+
}
140+
111141
private File generateFile(FileCollection files) {
112142
try {
113143
File file = File.createTempFile("spotbugs-gradle-plugin", ".txt");

0 commit comments

Comments
 (0)