【问题标题】:"Could not find or load main class" error for Gradle-generated Scala JARGradle 生成的 Scala JAR 的“找不到或加载主类”错误
【发布时间】:2017-05-16 00:28:12
【问题描述】:

经过大量研究,我似乎无法找到使用 Gradle 生成可运行 Scala jar 文件时遇到的问题的根源。我正在覆盖“jar”Gradle 任务以创建一个 jar 文件(包括依赖项),该文件从我的主类文件开始执行。但是,每当我运行它时,无论我对 Main-Class 属性使用什么,控制台都会抛出“无法找到或加载主类”错误。到目前为止,这是我所拥有的:

build.gradle

buildscript {
    repositories {
        mavenCentral()
    }
}

apply plugin: 'java'
apply plugin: 'scala'
apply plugin: 'application'

repositories {
    mavenCentral()
    // some other repos
}

version = '1.0'
sourceCompatibility = 1.8
targetCompatibility = 1.8

mainClassName = "com.test.Main"

dependencies {
    // my dependencies
}

jar {
    zip64 = true

    manifest {
        attributes "Main-Class": "$mainClassName"
    }

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

src/main/scala/com/test/Main.scala

package com.test

object Main {
  def main(args: Array[String]): Unit = {
    print("Hello world");
  }
}

实际上,当我运行“java tf test.jar”时,它会在 jar 的根目录中显示“com/test/Main.class”!我是否缺少一些重要的类路径信息或什么?我正在使用 Gradle 3.5 在 macOS Sierra 上运行 Java 1.8。任何帮助表示赞赏。谢谢!

【问题讨论】:

    标签: java scala gradle jar build


    【解决方案1】:

    我遇到了类似的问题,结果发现我的 jar 文件中的 META-INF 文件夹包含一些 RSA、SF 和 DSA 文件。

    一旦我排除了它们,它就起作用了!

    这里是如何基于你的 jar 声明

    jar {
        zip64 = true
    
        manifest {
            attributes "Main-Class": "$mainClassName"
        }
    
        from {
            configurations.compile.collect { it.isDirectory() ? it : zipTree(it) 
        }
        exclude ('META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA')
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用 Shadow Jar Plugin 代替您自己的 jar 定义。

      影子的好处

      阴影项目输出有 2 个主要用例:

      • 创建可执行的 JAR 分发版
      • 在库中捆绑和重定位常见依赖项以避免类路径冲突

      基本设置:

      shadowJar {
          baseName = 'your-app'
          classifier = 'all'
          version = version
          configurations = [project.configurations.compile]
      }
      
      jar {
          manifest {
              attributes 'Main-Class': 'com.test.Main'
          }
      }
      

      您可以使用 Gradle 插件的新语法:

      plugins {
          id 'java'
          id 'scala'
          id 'application'
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-21
        • 2017-03-30
        • 2021-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-21
        相关资源
        最近更新 更多