【问题标题】:Error during SonarQube Scanner execution : java.lang.IllegalArgumentException: 79 is not a valid line offset for pointerSonarQube Scanner 执行期间出错:java.lang.IllegalArgumentException: 79 is not a valid line offset for pointer
【发布时间】:2016-10-24 08:00:31
【问题描述】:

在 C# 项目上运行 SonarQube 时出现此错误消息:

...

INFO: ------------------------------------------------------------------------
INFO: EXECUTION FAILURE
INFO: ------------------------------------------------------------------------
INFO: Total time: 30.377s
INFO: Final Memory: 58M/828M
INFO: ------------------------------------------------------------------------
ERROR: Error during SonarQube Scanner execution
java.lang.IllegalArgumentException: 79 is not a valid line offset for pointer. File [moduleKey=dot-net_SCHLUMBERGER-Helios, relative=wtap_nextgen/Src/Component/WebSolution/MMS/wwwroot/css/bootwatch-paper.css, basedir=/builds/dot-net/SCHLUMBERGER-Helios] has 78 character(s) at line 1
    at org.sonar.api.internal.google.common.base.Preconditions.checkArgument(Preconditions.java:148)
    at org.sonar.api.batch.fs.internal.DefaultInputFile.checkValid(DefaultInputFile.java:218)
    at org.sonar.api.batch.fs.internal.DefaultInputFile.newPointer(DefaultInputFile.java:209)
    at org.sonar.api.batch.fs.internal.DefaultInputFile.newRange(DefaultInputFile.java:240)
    at org.sonar.css.issue.PreciseIssue.save(PreciseIssue.java:119)
    at org.sonar.plugins.css.CssSquidSensor.saveIssues(CssSquidSensor.java:121)
    at org.sonar.plugins.css.CssSquidSensor.save(CssSquidSensor.java:105)
    at org.sonar.plugins.css.CssSquidSensor.analyse(CssSquidSensor.java:89)
    at org.sonar.batch.phases.SensorsExecutor.executeSensor(SensorsExecutor.java:58)
    at org.sonar.batch.phases.SensorsExecutor.execute(SensorsExecutor.java:50)
    at org.sonar.batch.phases.AbstractPhaseExecutor.execute(AbstractPhaseExecutor.java:83)
    at org.sonar.batch.scan.ModuleScanContainer.doAfterStart(ModuleScanContainer.java:192)
    at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:142)
    at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:127)
    at org.sonar.batch.scan.ProjectScanContainer.scan(ProjectScanContainer.java:241)
    at org.sonar.batch.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:236)
    at org.sonar.batch.scan.ProjectScanContainer.doAfterStart(ProjectScanContainer.java:226)
    at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:142)
    at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:127)
    at org.sonar.batch.task.ScanTask.execute(ScanTask.java:47)
    at org.sonar.batch.task.TaskContainer.doAfterStart(TaskContainer.java:86)
    at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:142)
    at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:127)
    at org.sonar.batch.bootstrap.GlobalContainer.executeTask(GlobalContainer.java:106)
    at org.sonar.batch.bootstrapper.Batch.executeTask(Batch.java:119)
    at org.sonarsource.scanner.api.internal.batch.BatchIsolatedLauncher.execute(BatchIsolatedLauncher.java:62)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    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:240)
    at org.sonarsource.scanner.api.EmbeddedScanner.runAnalysis(EmbeddedScanner.java:151)
    at org.sonarsource.scanner.cli.Main.runAnalysis(Main.java:110)
    at org.sonarsource.scanner.cli.Main.execute(Main.java:72)
    at org.sonarsource.scanner.cli.Main.main(Main.java:60)

ERROR: Build failed: exit code 1

有人知道这是从哪里来的吗? 看起来扫描仪正试图访问XXX/bootwatch-paper.css 第一行的第 79 个字符,它只有 78 个字符。为什么它会尝试读取第 79 个字符? 这可能是编码问题吗? 如何解决这个问题?

干杯!

【问题讨论】:

标签: c# css sonarqube


【解决方案1】:

我的一个 AssemblyInfo.cs 文件也有类似的问题。这绝对是编码。我在 Sublime Text 中打开文件并用不同的编码保存它,看看有什么用。以下是我发现的,虽然对你来说可能会有所不同,因为我使用的是 C# 插件,而你使用的是 css 插件。

  1. UTF-8 - 成功
  2. 带有 BOM 的 UTF-8 - 成功
  3. UTF-16 LE - 成功
  4. 带有 BOM 的 UTF-16 LE - 失败
  5. UTF-16 BE - 成功
  6. UTF-16 BE 与 BOM - 失败
  7. 西方 (Windows 1252) - 成功

【讨论】:

  • 我的 GlobalSuppressions.cs 也有类似的问题,转换为 UTF-8 解决了我的问题。谢谢
【解决方案2】:

可能是文件编码是:带有BOM的UTF-8编码, 您应该将文件更改为不带 BOM 的 UTF-8 编码

#coding=utf-8
'''
#  prerequisite: python2.7
#  usage:  
#             python utf8-convert.py -h 
#             python utf8-convert.py -f file_path_you_want_to_convert
#  reference links:
#
#  http://stackoverflow.com/questions/8898294/convert-utf-8-with-bom-to-utf-8-with-no-bom-in-python
#  http://stackoverflow.com/questions/3207219/how-to-list-all-files-of-a-directory-in-python
'''

import os
import codecs
import chardet
from optparse import OptionParser


def utf8_converter(file_path, universal_endline=True):
    '''
    Convert any type of file to UTF-8 without BOM
    and using universal endline by default.

    Parameters
    ----------
    file_path : string, file path.
    universal_endline : boolean (True),
                        by default convert endlines to universal format.
    '''

    # Fix file path
    file_path = os.path.realpath(os.path.expanduser(file_path))

    if not os.path.isfile(file_path):
        print '[WARN] filepath is not a file: ' + file_path

    # Read from file
    file_open = open(file_path)
    raw = file_open.read()
    file_open.close()

    file_encoding = str(chardet.detect(raw)['encoding'])
    if raw.startswith(codecs.BOM_UTF8):
        print '[INFO] convert  :encoding('+file_encoding+ ")  " + file_path
    else:
        print '[INFO] skipped  :encoding('+file_encoding+")  " + file_path
        return 0

    # Decode
    raw = raw.decode(chardet.detect(raw)['encoding'])
    # Remove windows end line
    if universal_endline:
        raw = raw.replace('\r\n', '\n')
    # Encode to UTF-8
    raw = raw.encode('utf8')
    # Remove BOM
    if raw.startswith(codecs.BOM_UTF8):
        raw = raw.replace(codecs.BOM_UTF8, '', 1)

    while raw.startswith(codecs.BOM_UTF8):
        raw = raw.replace(codecs.BOM_UTF8, '', 1)

    # Write to file
    file_open = open(file_path, 'w')
    file_open.write(raw)
    file_open.close()
    return 0

if __name__ == "__main__":
    PARSER = OptionParser()
    PARSER.add_option("-f", "--file", action="store", type="string", \
                                      dest="filename", help="file you want to convert")
    OPTIONS, ARGS = PARSER.parse_args()

    if OPTIONS.filename:
        utf8_converter(OPTIONS.filename)

【讨论】:

  • 是的,要么 BOM 是问题所在,要么它似乎也不喜欢在文件中最后添加注释。
猜你喜欢
  • 2017-04-23
  • 2016-07-05
  • 1970-01-01
  • 2017-03-28
  • 2022-06-21
  • 2012-09-11
  • 2014-02-25
  • 2019-03-11
相关资源
最近更新 更多