从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()
}
}
}
其中getSCMRevision()
和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
如果这与文件编码有关,是否有推荐的编码方式?还有其他任何可能的解决方案吗?
提前致谢,
Bhooshan
更新:
出现此问题的原因是方法getSCMRevision()
和getSCMBranch()
是在自定义插件中定义的。如果我删除这些方法,MANIFEST.MF文件不包含^ M个字符。如果我将清单定义完全移动到自定义插件,我会看到问题。如果我在项目的build.gradle中定义了所有内容,我就看不到^ M字符了。它们似乎只有在我从清单闭包中的自定义插件中调用任何功能时才会出现。
有什么想法吗?