web-dev-qa-db-ja.com

Gradle-メインクラスを見つけることができませんでした

Gradleを使用して非常に単純なプロジェクトを実行しようとしていますが、gradlew run commandを使用すると次のエラーが発生します。

could not find or load main class 'hello.HelloWorld'

私のファイル構造は次のとおりです。

SpringTest
    -src
        -hello
            -HelloWorld.Java
            -Greeter.Java
    -build
         -libs
         -tmp
    -gradle
         -wrapper
    -build.gradle
    -gradlew
    -gradlew.bat

Libsおよびtmpフォルダーの内容は除外しました。これは、この問題に関連する情報だとは思わなかったためですが、必要に応じて追加できます。

ここに私のbuild.gradleファイルがあります:

apply plugin: 'Java'
apply plugin: 'application'
apply plugin: 'Eclipse'

mainClassName = 'hello/HelloWorld'

repositories {
    mavenLocal()
    mavenCentral()
}

dependencies {
    compile "joda-time:joda-time:2.2"
}

jar {
    baseName = "gs-gradle"
    version = "0.1.0"
}

task wrapper(type: Wrapper) {
    gradleVersion = '1.11'
}

この問題を修正する方法についてのアイデアはありますか? mainClassName属性に対してあらゆる種類のことを試しましたが、何も機能していないようです。

57
twilco

ここには2つの問題があります。1つはsourceSetに、もう1つはmainClassNameにあります。

  1. Javaソースファイルをsrcだけでなくsrc/main/Javaに移動します。または、以下をbuild.gradleに追加して、sourceSetを適切に設定します。

    sourceSets.main.Java.srcDirs = ['src']
    
  2. mainClassNameは、パスではなく完全修飾クラス名にする必要があります。

    mainClassName = "hello.HelloWorld"
    
61
kunal

Build.gradleを変更して、メインクラスをマニフェストに追加します。

jar {
    manifest {
        attributes 'Implementation-Title': 'Gradle Quickstart',
                   'Implementation-Version': version,
                   'Main-Class': 'hello.helloWorld'
    }
}
27
Noumenon

インターネットで解決策を見つけることができなかったため、この問題にぶつかり、自分でデバッグすることにしました。 mainClassNameを完全なパスに変更するだけです(プロジェクトofcの正しいサブディレクトリを使用)

    mainClassName = 'main.Java.hello.HelloWorld'

投稿が行われてからほぼ1年が経ちましたが、誰かがこの情報を役立つと思うと思います。

ハッピーコーディング。

19
hepifish

Netbeansからgradleプロジェクトを実行しようとする初心者のために明確にするために:
これを理解するには、メインクラス名がどのように見えるかを確認する必要がありますand gradleビルドがどのように見えるか

メインクラス:

package com.stormtrident;

public class StormTrident {
    public static void main(String[] cmdArgs) {
    }
}

パッケージ「com.stormtrident」の一部であることに注意してください。

Gradleビルド:

apply plugin: 'Java'

defaultTasks 'jar'

jar {
 from {
        (configurations.runtime).collect {
            it.isDirectory() ? it : zipTree(it)
        }
    }    
    manifest {
        attributes 'Main-Class': 'com.stormtrident.StormTrident'
    }
}


sourceCompatibility = '1.8'
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'

if (!hasProperty('mainClass')) {
    ext.mainClass = 'com.stormtrident.StormTrident'
}

repositories {
    mavenCentral()
}

dependencies {
    //---Apache storm
    compile 'org.Apache.storm:storm-core:1.0.0'  //compile 
    testCompile group: 'junit', name: 'junit', version: '4.10'
}
8
Nav

しばらくの間、同じ問題に苦しんでいました。ただし、ディレクトリ構造src/main/Javaを作成し、ソースを(パッケージの先頭から)配置すると、期待どおりに機能しました。

チュートリアル で試しました。 gradle buildを実行した後、classesディレクトリの下でbuildを見つける必要があります。

2
Dino Tw

私のbuild.gradleでは、タスクを作成し、次のように「mainClassName」を指定することでこの問題を解決しました。

task(runSimpleXYZProgram, group: 'algorithms', description: 'Description of what your program does', dependsOn: 'classes', type: JavaExec) {
    mainClassName = 'your.entire.package.classContainingYourMainMethod'
}
1
Psi-Ed

以下のコードをアプリケーションに追加して解決しました。

//ここにコードを入力します。これは、build.gradleを実行したときに取得していたエラーです。メインクラス名が設定されておらず、解決できませんでした

public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
}
1
Premakumar

Gradle build by byを実行することでこれを修正しました(またはgradle buildフォルダーを手動で削除します)

これは、メインクラスを新しいパッケージに移動し、古いメインクラスがclaspathでまだ参照されている場合に発生します

0
JohnTheBeloved
  1. gradle.propertiesが正しいJava_HOVEを定義しているかどうかを確認します

    org.gradle.Java.home = C:\ Program Files(x86)\ Java\jdk1.8.0_181

または

  1. 定義されていない場合は、EclipseがJREではなくJDKを知っているかどうかを確認してください

enter image description here

0
cane

このエラーが発生したのは、パッケージにクラスがなかったためであったためです。 HelloWorld.Javaファイルを「パッケージ」フォルダーに入れます。新しいパッケージフォルダーを作成する必要がある場合があります。

helloフォルダーを右クリックして、[新規]> [パッケージ]を選択します。次に、名前(例:com.example)を付けて、HelloWorld.Javaクラスをパッケージに移動します。

0
RichArt

次のようなプロジェクト構造の場合

project_name/src/main/Java/Main_File.class

ファイルbuild.gradleに、次の行を追加します

mainClassName = 'Main_File'
0
kapsid

hello.WorldクラスをKotlinで記述することにした場合、別の問題として、mainClassName = "hello.WorldKt"として参照する必要がある場合があります。

src/main/Java/hello/World.kt:

package hello
fun main(args: Array<String>) {
    ...
}
// class World {} // this line is not necessary
0
Giszmo