来自http://forums.gradle.org/gradle/topics/_m_in_manifest_mf_file_generated_through_gradle的交叉发帖
我在我的 gradle 项目中看到 jar 清单文件存在问题。我正在为我的构建中的 jar 生成清单文件 -
project(':myproject') {
jar {
manifest {
attributes 'Implementation-Title': 'My Project',
'Implementation-Version': project.version,
'Built-By': System.getProperty('user.name'),
'Built-Date': new Date(),
'Built-JDK': System.getProperty('java.version'),
'Created-By': 'Gradle',
'Git-Commit': getSCMRevision(),
'Git-Branch': getSCMBranch()
}
}
}
wheregetSCMRevision()
和getSCMBranch()
是通过自定义插件公开的静态方法。
构建执行后,MANIFEST.MF 文件包含所有正确信息,但是,它似乎在每一行的末尾添加了一个或多个“^M”字符。因此,当我尝试使用包含在该项目的 jar 中的主类执行 java 命令时,java 错误为 - Error: Could not find or load main class
。这可能是因为 jar 中有一个损坏的 MANIFEST.MF。一旦我打开 jar,删除 '^M' 字符并使用 'jar cf' 重建 jar,java 命令就可以工作了。
当我在 OSX (Mavericks) 和 Centos 6.3 上构建时,我可以看到这个错误。我正在使用 gradle 1.11
如果这与文件编码有关,是否有推荐的设置编码方式?对此还有其他可能的解决方案吗?
提前致谢,
布山
更新:似乎发生此问题是因为方法getSCMRevision()
和getSCMBranch()
自定义插件中定义。如果我删除这些方法,则 MANIFEST.MF 文件不包含 ^M 字符。如果我将清单定义完全移动到自定义插件,我会看到问题。如果我在项目的 build.gradle 中定义所有内容,则看不到 ^M 字符。它们似乎只有在我从清单闭包中的自定义插件调用任何功能时才会出现。
有什么想法吗?