Bug: syntax error in sonar properties crashes scanner

I have just spent some time tracking down the following problem:

NFO: Scanner configuration file: /zuul/target/sonar/sonar-scanner-4.7.0.2747-linux/conf/sonar-scanner.properties
INFO: Project root configuration file: /zuul/sonar-project.properties
INFO: SonarScanner 4.7.0.2747
INFO: Java 11.0.14.1 Eclipse Adoptium (64-bit)
INFO: Linux 5.15.0-1031-azure amd64
INFO: User cache: /home/brucea/.sonar/cache
INFO: Scanner configuration file: /zuul/target/sonar/sonar-scanner-4.7.0.2747-linux/conf/sonar-scanner.properties
INFO: Project root configuration file: /home2/brucea/work/git/rtmvodapi/sonar-project.properties
INFO: Analyzing on SonarCloud
INFO: Default locale: "en", source code encoding: "UTF-8" (analysis is platform dependent)
INFO: Load global settings
INFO: Load global settings (done) | time=202ms
INFO: Server id: XXXXXXX
INFO: User cache: /home/brucea/.sonar/cache
INFO: Load/download plugins
INFO: Load plugins index
INFO: Load plugins index (done) | time=181ms
INFO: Load/download plugins (done) | time=357ms
INFO: Loaded core extensions: developer-scanner
INFO: Load project settings for component key: 'blahblah'
INFO: Load project settings for component key: 'blahblah' (done) | time=170ms
INFO: Process project properties
INFO: Execute project builders
INFO: Execute project builders (done) | time=1ms
INFO: Project key: blahblah
INFO: Base dir: /zuul
INFO: Working dir: /zuul/.scannerwork
INFO: Load project branches
INFO: Load project branches (done) | time=182ms
INFO: Check ALM binding of project 'blah blah'
INFO: Detected project binding: NOT_BOUND
INFO: Check ALM binding of project 'blah blah' (done) | time=140ms
INFO: Load project pull requests
INFO: Load project pull requests (done) | time=145ms
INFO: Load branch configuration
INFO: Load branch configuration (done) | time=1ms
INFO: Load quality profiles
INFO: Load quality profiles (done) | time=216ms
INFO: Load active rules
INFO: Load active rules (done) | time=2757ms
INFO: Organization key: kantar-media
INFO: Branch name: 1.2.5_task/blahblah_manual, type: short-lived
INFO: ------------------------------------------------------------------------
INFO: EXECUTION FAILURE
INFO: ------------------------------------------------------------------------
INFO: Total time: 6.132s
INFO: Final Memory: 20M/70M
INFO: ------------------------------------------------------------------------
ERROR: Error during SonarScanner execution
java.lang.IllegalStateException: Unable to load component class org.sonar.scanner.scan.filesystem.ProjectFileIndexer
	at org.sonar.core.platform.ComponentContainer$ExtendedDefaultPicoContainer.getComponent(ComponentContainer.java:52)
	at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:678)
	at org.sonar.core.platform.ComponentContainer.getComponentByType(ComponentContainer.java:273)
	at org.sonar.scanner.scan.ProjectScanContainer.doAfterStart(ProjectScanContainer.java:412)
	at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:123)
	at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:109)
	at org.sonar.scanner.bootstrap.GlobalContainer.doAfterStart(GlobalContainer.java:130)
	at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:123)
	at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:109)
	at org.sonar.batch.bootstrapper.Batch.doExecute(Batch.java:58)
	at org.sonar.batch.bootstrapper.Batch.execute(Batch.java:52)
	at org.sonarsource.scanner.api.internal.batch.BatchIsolatedLauncher.execute(BatchIsolatedLauncher.java:46)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.base/java.lang.reflect.Method.invoke(Unknown Source)
	at org.sonarsource.scanner.api.internal.IsolatedLauncherProxy.invoke(IsolatedLauncherProxy.java:60)
	at com.sun.proxy.$Proxy0.execute(Unknown Source)
	at org.sonarsource.scanner.api.EmbeddedScanner.doExecute(EmbeddedScanner.java:189)
	at org.sonarsource.scanner.api.EmbeddedScanner.execute(EmbeddedScanner.java:138)
	at org.sonarsource.scanner.cli.Main.execute(Main.java:112)
	at org.sonarsource.scanner.cli.Main.execute(Main.java:75)
	at org.sonarsource.scanner.cli.Main.main(Main.java:61)
Caused by: java.lang.IllegalStateException: Unable to load component class org.sonar.scanner.scan.filesystem.ProjectExclusionFilters
	at org.sonar.core.platform.ComponentContainer$ExtendedDefaultPicoContainer.getComponent(ComponentContainer.java:52)
	at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:632)
	at org.picocontainer.parameters.BasicComponentParameter$1.resolveInstance(BasicComponentParameter.java:118)
	at org.picocontainer.parameters.ComponentParameter$1.resolveInstance(ComponentParameter.java:136)
	at org.picocontainer.injectors.SingleMemberInjector.getParameter(SingleMemberInjector.java:78)
	at org.picocontainer.injectors.ConstructorInjector$CtorAndAdapters.getParameterArguments(ConstructorInjector.java:309)
	at org.picocontainer.injectors.ConstructorInjector$1.run(ConstructorInjector.java:335)
	at org.picocontainer.injectors.AbstractInjector$ThreadLocalCyclicDependencyGuard.observe(AbstractInjector.java:270)
	at org.picocontainer.injectors.ConstructorInjector.getComponentInstance(ConstructorInjector.java:364)
	at org.picocontainer.injectors.AbstractInjectionFactory$LifecycleAdapter.getComponentInstance(AbstractInjectionFactory.java:56)
	at org.picocontainer.behaviors.AbstractBehavior.getComponentInstance(AbstractBehavior.java:64)
	at org.picocontainer.behaviors.Stored.getComponentInstance(Stored.java:91)
	at org.picocontainer.DefaultPicoContainer.getInstance(DefaultPicoContainer.java:699)
	at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:647)
	at org.sonar.core.platform.ComponentContainer$ExtendedDefaultPicoContainer.getComponent(ComponentContainer.java:50)
	... 22 more
Caused by: java.lang.IllegalStateException: Property: 'sonar.exclusions' doesn't contain a valid CSV value: '"go/pkg/**/*.js";azure-pipelines.yml'
	at org.sonar.api.config.internal.MultivalueProperty.parseAsCsv(MultivalueProperty.java:43)
	at org.sonar.api.config.internal.MultivalueProperty.parseAsCsv(MultivalueProperty.java:25)
	at org.sonar.scanner.config.DefaultConfiguration.getStringArray(DefaultConfiguration.java:94)
	at org.sonar.scanner.scan.filesystem.AbstractExclusionFilters.exclusions(AbstractExclusionFilters.java:62)
	at org.sonar.scanner.scan.filesystem.AbstractExclusionFilters.<init>(AbstractExclusionFilters.java:37)
	at org.sonar.scanner.scan.filesystem.ProjectExclusionFilters.<init>(ProjectExclusionFilters.java:13)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.base/java.lang.reflect.Constructor.newInstance(Unknown Source)
	at org.picocontainer.injectors.AbstractInjector.newInstance(AbstractInjector.java:145)
	at org.picocontainer.injectors.ConstructorInjector$1.run(ConstructorInjector.java:342)
	at org.picocontainer.injectors.AbstractInjector$ThreadLocalCyclicDependencyGuard.observe(AbstractInjector.java:270)
	at org.picocontainer.injectors.ConstructorInjector.getComponentInstance(ConstructorInjector.java:364)
	at org.picocontainer.injectors.AbstractInjectionFactory$LifecycleAdapter.getComponentInstance(AbstractInjectionFactory.java:56)
	at org.picocontainer.behaviors.AbstractBehavior.getComponentInstance(AbstractBehavior.java:64)
	at org.picocontainer.behaviors.Stored.getComponentInstance(Stored.java:91)
	at org.picocontainer.DefaultPicoContainer.getInstance(DefaultPicoContainer.java:699)
	at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:647)
	at org.sonar.core.platform.ComponentContainer$ExtendedDefaultPicoContainer.getComponent(ComponentContainer.java:50)
	... 36 more
Caused by: java.io.IOException: (line 1) invalid char between encapsulated token and delimiter
	at org.apache.commons.csv.Lexer.parseEncapsulatedToken(Lexer.java:275)
	at org.apache.commons.csv.Lexer.nextToken(Lexer.java:152)
	at org.apache.commons.csv.CSVParser.nextRecord(CSVParser.java:500)
	at org.apache.commons.csv.CSVParser.getRecords(CSVParser.java:366)
	at org.sonar.api.config.internal.MultivalueProperty.parseAsCsv(MultivalueProperty.java:36)
	... 55 more
ERROR: 
ERROR: Re-run SonarScanner using the -X switch to enable full debug logging.

The cause turned out to be this:

sonar.exclusions="go/pkg/**/*.js";azure-pipelines.yml

Which should instead be this:

sonar.exclusions="go/pkg/**/*.js;azure-pipelines.yml"

I do not know how a syntax (or maybe semantic) error like this can lead the sonar scanner to fail to “load a component” but something is not right. The error message is not helpful.

Hi,

What would you have expected it to be? (And BTW, your working value still isn’t a comma-separated value so I’m surprised it’s working.)

 
Ann

java.lang.IllegalStateException: Unable to load component class org.sonar.scanner.scan.filesystem.ProjectFileIndexer

Looks like an error loading a class.
I would expect an error message complaining about failing to parse a file.
So something at least like:

sonar-project.properties: error: unable to parse file

or better yet some clues as to the problem and the correct format:

sonar-project.properties: line 3: error: invalid value for property 'sonar.exclusions'
expected format is quote delimited, list separated set of patterns to match. See https://path/to/docs

It is also worth noting that the main page about exclusions does not mention what the list separator is:

Actually I’m not clear if this is related to standard java properties syntax and if comma is standard for that as I rarely use java. I have not been able to find a mention of this in the docs.

1 Like

Hi,

Thanks for the feedback. I’ll pass it on to the team.

 
Ann

Hi,
The error message includes:

Maybe not very intuitive for non-java developers to show the full chain of events linked to the error but I think the message is reasonably clear.

I see it now you’ve pointed me at it. I wonder if your colleague missed it too?
The problem is it is buried half way up the stack trace (or between two stack traces).
I’d expect the error report first then the stack trace.

Hi,

No, I didn’t miss it.

I didn’t realize you did.

 
Ann