通过Gradle构建emply OSGi捆绑包

通过Gradle构建emply OSGi捆绑包,gradle,osgi,Gradle,Osgi,我有一个build.gradle文件: apply plugin: "java" apply plugin: "maven" apply plugin: "osgi" group = "aaa" archivesBaseName = 'b.c.d' version = "0.0.1-SNAPSHOT" def packages = [ "com.some.package1", "com.some.package2" ] jar { manifest {

我有一个
build.gradle
文件:

apply plugin: "java"
apply plugin: "maven"
apply plugin: "osgi"

group = "aaa"
archivesBaseName = 'b.c.d'
version = "0.0.1-SNAPSHOT"

def packages = [
    "com.some.package1",
    "com.some.package2"
]

jar {
     manifest {
        instruction 'Bundle-Vendor', 'Some vendor'
        instruction 'Fragment-Host', 'system.bundle;extension:=framework'
        instruction 'Export-Package', packages.toString().replace("[","").replace("]","")
    }
}
我想用
MANIFEST.MF
获取空的
jar
文件,但是:

Jar只能接受有效的文件或目录:/my_directory/aaa/build/classes/main

org.gradle.api.GradleException:无法将MANIFEST.MF复制到“/my_目录/aaa/build/tmp/jar/MANIFEST.MF”。
位于org.gradle.api.internal.file.AbstractFileTreeElement.copyTo(AbstractFileTreeElement.java:79)
位于org.gradle.api.internal.file.collections.MapFileTree$filevisitdetailsiml.getFile(MapFileTree.java:162)
位于org.gradle.api.internal.file.collections.MapFileTree$filevisitdetailsiml.getSize(MapFileTree.java:222)
位于org.gradle.api.internal.file.FileTreeElementHasher.calculateHashForFileMetadata(FileTreeElementHasher.java:47)
位于org.gradle.api.internal.changedetection.state.DefaultVisitedTree.CalculateTechKhash(DefaultVisitedTree.java:89)
在org.gradle.api.internal.changedetection.state.visitedTreeSprechecHasher.calculateRepecheckhash(visitedTreeSprechecHasher.java:47)
位于org.gradle.api.internal.changedetection.state.AbstractFileCollectionSnapshotter$DefaultFileCollectionSnapshotPreCheck.getHash(AbstractFileCollectionSnapshotter.java:110)
位于org.gradle.api.internal.changedetection.rules.InputFilesTaskStateChanges。(InputFilesTaskStateChanges.java:41)
位于org.gradle.api.internal.changedetection.rules.TaskUpToDateState。(TaskUpToDateState.java:52)
位于org.gradle.api.internal.changedetection.changes.DefaultTaskArtifactStateRepository$TaskArtifactStateImpl.getState(DefaultTaskArtifactStateRepository.java:145)
位于org.gradle.api.internal.changedetection.changes.DefaultTaskArtifactStateRepository$TaskArtifactStateImpl.isUpdate(DefaultTaskArtifactStateRepository.java:74)
位于org.gradle.api.internal.tasks.execution.skipptodatetaskexecuter.execute(skipptodatetaskexecuter.java:53)
...
原因:java.lang.IllegalArgumentException:Jar只能接受有效的文件或目录:/my_directory/aaa/build/classes/main
位于aqte.bnd.osgi.Jar(Jar.java:58)
位于aqte.bnd.osgi.Jar(Jar.java:76)
位于aqte.bnd.osgi.Analyzer.setJar(Analyzer.java:1279)
位于org.gradle.api.internal.plugins.osgi.DefaultOsgiManifest.setAnalyzerProperties(DefaultOsgiManifest.java:125)
位于org.gradle.api.internal.plugins.osgi.DefaultOsgiManifest.getEffectiveManifest(DefaultOsgiManifest.java:69)
位于org.gradle.api.internal.plugins.osgi.DefaultOsgiManifest_decorded.getEffectiveManifest(未知源)
位于org.gradle.api.internal.plugins.osgi.DefaultOsgiManifest.getEffectiveManifest(DefaultOsgiManifest.java:35)
位于org.gradle.api.java.archives.internal.DefaultManifest.writeTo(DefaultManifest.java:220)
位于org.gradle.api.java.archives.internal.DefaultManifest.writeTo(DefaultManifest.java:214)
位于org.gradle.jvm.tasks.Jar$1$1.execute(Jar.java:77)
位于org.gradle.jvm.tasks.Jar$1$1.execute(Jar.java:64)
位于org.gradle.api.internal.file.collections.MapFileTree$filevisitdetailsiml.copyTo(MapFileTree.java:174)
位于org.gradle.api.internal.file.AbstractFileTreeElement.copyFile(AbstractFileTreeElement.java:93)
位于org.gradle.api.internal.file.AbstractFileTreeElement.copyTo(AbstractFileTreeElement.java:74)
... 65多

如果我在
/my_目录/aaa/src/main/java/
中创建空类,它可以正常工作。我也可以在不使用osgi插件的情况下制作这个
jar
,但这将是一个更好的解决方案。

最终会出现相同的场景。你有没有找到解决办法?@Arundev没有,我没有看。这更像是学术上的兴趣,安德烈-好的,谢谢你的重播。嗨@Arundev,有什么解决办法吗。困在同一个地方。@user3556411-我离开了那个公司,忘了我是怎么克服这个伙伴的。我想最后还是手动编辑jar文件清单。
org.gradle.api.GradleException: Could not copy MANIFEST.MF to '/my_directory/aaa/build/tmp/jar/MANIFEST.MF'.
        at org.gradle.api.internal.file.AbstractFileTreeElement.copyTo(AbstractFileTreeElement.java:79)
        at org.gradle.api.internal.file.collections.MapFileTree$FileVisitDetailsImpl.getFile(MapFileTree.java:162)
        at org.gradle.api.internal.file.collections.MapFileTree$FileVisitDetailsImpl.getSize(MapFileTree.java:222)
        at org.gradle.api.internal.file.FileTreeElementHasher.calculateHashForFileMetadata(FileTreeElementHasher.java:47)
        at org.gradle.api.internal.changedetection.state.DefaultVisitedTree.calculatePreCheckHash(DefaultVisitedTree.java:89)
        at org.gradle.api.internal.changedetection.state.VisitedTreesPreCheckHasher.calculatePreCheckHash(VisitedTreesPreCheckHasher.java:47)
        at org.gradle.api.internal.changedetection.state.AbstractFileCollectionSnapshotter$DefaultFileCollectionSnapshotPreCheck.getHash(AbstractFileCollectionSnapshotter.java:110)
        at org.gradle.api.internal.changedetection.rules.InputFilesTaskStateChanges.<init>(InputFilesTaskStateChanges.java:41)
        at org.gradle.api.internal.changedetection.rules.TaskUpToDateState.<init>(TaskUpToDateState.java:52)
        at org.gradle.api.internal.changedetection.changes.DefaultTaskArtifactStateRepository$TaskArtifactStateImpl.getStates(DefaultTaskArtifactStateRepository.java:145)
        at org.gradle.api.internal.changedetection.changes.DefaultTaskArtifactStateRepository$TaskArtifactStateImpl.isUpToDate(DefaultTaskArtifactStateRepository.java:74)
        at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:53)
...
Caused by: java.lang.IllegalArgumentException: A Jar can only accept a valid file or directory: /my_directory/aaa/build/classes/main
        at aQute.bnd.osgi.Jar.<init>(Jar.java:58)
        at aQute.bnd.osgi.Jar.<init>(Jar.java:76)
        at aQute.bnd.osgi.Analyzer.setJar(Analyzer.java:1279)
        at org.gradle.api.internal.plugins.osgi.DefaultOsgiManifest.setAnalyzerProperties(DefaultOsgiManifest.java:125)
        at org.gradle.api.internal.plugins.osgi.DefaultOsgiManifest.getEffectiveManifest(DefaultOsgiManifest.java:69)
        at org.gradle.api.internal.plugins.osgi.DefaultOsgiManifest_Decorated.getEffectiveManifest(Unknown Source)
        at org.gradle.api.internal.plugins.osgi.DefaultOsgiManifest.getEffectiveManifest(DefaultOsgiManifest.java:35)
        at org.gradle.api.java.archives.internal.DefaultManifest.writeTo(DefaultManifest.java:220)
        at org.gradle.api.java.archives.internal.DefaultManifest.writeTo(DefaultManifest.java:214)
        at org.gradle.jvm.tasks.Jar$1$1.execute(Jar.java:77)
        at org.gradle.jvm.tasks.Jar$1$1.execute(Jar.java:64)
        at org.gradle.api.internal.file.collections.MapFileTree$FileVisitDetailsImpl.copyTo(MapFileTree.java:174)
        at org.gradle.api.internal.file.AbstractFileTreeElement.copyFile(AbstractFileTreeElement.java:93)
        at org.gradle.api.internal.file.AbstractFileTreeElement.copyTo(AbstractFileTreeElement.java:74)
        ... 65 more