【问题标题】:Exporting apache netbeans gradle project to jar file将 apache netbeans gradle 项目导出到 jar 文件
【发布时间】:2020-04-21 20:18:04
【问题描述】:

我创建了一个 Netbeans Gradle 项目,我正在尝试找到将其导出到 .jar 文件的最佳方法,以便可以从 IDE 外部打开它。我在我的项目中使用依赖项,我收到一个 java.lang.NoClassDefFoundError。

为了解决这个问题,我尝试添加

jar {
manifest {
    attributes "Main-Class": "CollegeCounselor.Main"
}

from{

    configurations.compile.collect{ it.isDirectory() ? it : zipTree(it)}

    }
}

到我的 build.gradle 文件。但是,这引发了 java.lang.SecurityException: Invalid signature file digest for Manifest main attributes。

为了解决这个问题,我找到了添加建议

{exclude 'META-INF/*.RSA', 'META-INF/*.SF', 'META-INF/*.DSA'}

到我的文件。这解决了通过命令行运行文件的问题。通过java -jar 运行它现在可以工作了。但是,我仍然无法通过我的 mac 上的 finder 运行它。它给了我一个错误,说无法启动 java jar,并告诉我检查控制台以获取更多详细信息。我无法理解如何解决这个问题,或者为什么我可以通过命令行而不是通过 finder 窗口运行它。我要去 build/libs/file.jar 路径并尝试打开这个文件。

任何有关导出此项目的最佳方式的帮助将不胜感激。

这是我的完整 build.gradle 文件:

apply plugin: 'java'
apply plugin: 'jacoco'
apply plugin: 'application'


mainClassName = 'CollegeCounselor.Main'

repositories {
    jcenter()
}



dependencies {
    testCompile 'junit:junit:4.12'
    compile('com.microsoft.graph:microsoft-graph:1.5.+')
    compile group: 'com.microsoft.azure', name: 'msal4j', version: '1.4.0'
    compile group: 'org.slf4j', name: 'slf4j-log4j12', version: '1.7.25'
}

jar {
    manifest {
        attributes "Main-Class": "CollegeCounselor.Main"
    }

    from { (configurations.runtime).collect { it.isDirectory() ? it : zipTree(it) } } 
{
        exclude 'META-INF/*.RSA', 'META-INF/*.SF', 'META-INF/*.DSA'
    }

}

【问题讨论】:

  • 更新您的问题以显示:[1] jar 文件中的 MANIFEST.MF 的内容在您的 Mac 上不起作用。 [2] 您在 Mac 上遇到的错误的确切文本。 [3] brew info gradle的输出。

标签: java gradle netbeans


【解决方案1】:

这对我有用:

  • 使用项目向导创建一个名为 gradleproject2 的简单 Gradle 应用程序文件 > 新建项目...> Java with Gradle > Java 应用程序
  • 编辑 build.gradle based on this SO answer,添加以下条目:
jar {
  manifest {
    attributes(
      'Class-Path': configurations.compile.collect { it.getName() }.join(' '),
      'Main-Class': 'hello.HelloWorld'
    )
  }
}
  • 然后将hello.HelloWorld替换为你的包和包含main()的类的名称,在我的例子中是gradleproject2.Main,所以我修改后的build.gradle看起来像这样:
apply plugin: 'java'
apply plugin: 'jacoco'
apply plugin: 'application'


mainClassName = 'gradleproject2.Main'

repositories {
    jcenter()
}

dependencies {
    testImplementation     'junit:junit:4.13'
}

jar {
  manifest {
    attributes(
      'Class-Path': configurations.compile.collect { it.getName() }.join(' '),
      'Main-Class': 'gradleproject2.Main'
    )
  }
}
  • 构建您的项目,将 jar 文件 gradleproject2.jar 放入 {project directory}\build\libs

更改build.gradle的效果是将jar文件中MANIFEST.MF的内容从:

Manifest-Version: 1.0

...到这个:

Manifest-Version: 1.0
Class-Path:
Main-Class: gradleproject2.Main

最后,从命令行运行 jar 文件。在我的情况下,命令只是java -jar gradleproject2.jar:

【讨论】:

    猜你喜欢
    • 2020-04-03
    • 1970-01-01
    • 2013-01-12
    • 2022-08-14
    • 2014-10-20
    • 1970-01-01
    • 2013-04-14
    • 2012-05-12
    • 1970-01-01
    相关资源
    最近更新 更多