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属性に対してあらゆる種類のことを試しましたが、何も機能していないようです。
ここには2つの問題があります。1つはsourceSet
に、もう1つはmainClassName
にあります。
Javaソースファイルをsrc
だけでなくsrc/main/Java
に移動します。または、以下をbuild.gradleに追加して、sourceSet
を適切に設定します。
sourceSets.main.Java.srcDirs = ['src']
mainClassName
は、パスではなく完全修飾クラス名にする必要があります。
mainClassName = "hello.HelloWorld"
Build.gradleを変更して、メインクラスをマニフェストに追加します。
jar {
manifest {
attributes 'Implementation-Title': 'Gradle Quickstart',
'Implementation-Version': version,
'Main-Class': 'hello.helloWorld'
}
}
インターネットで解決策を見つけることができなかったため、この問題にぶつかり、自分でデバッグすることにしました。 mainClassNameを完全なパスに変更するだけです(プロジェクトofcの正しいサブディレクトリを使用)
mainClassName = 'main.Java.hello.HelloWorld'
投稿が行われてからほぼ1年が経ちましたが、誰かがこの情報を役立つと思うと思います。
ハッピーコーディング。
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'
}
しばらくの間、同じ問題に苦しんでいました。ただし、ディレクトリ構造src/main/Javaを作成し、ソースを(パッケージの先頭から)配置すると、期待どおりに機能しました。
チュートリアル で試しました。 gradle build
を実行した後、classes
ディレクトリの下でbuild
を見つける必要があります。
私のbuild.gradleでは、タスクを作成し、次のように「mainClassName」を指定することでこの問題を解決しました。
task(runSimpleXYZProgram, group: 'algorithms', description: 'Description of what your program does', dependsOn: 'classes', type: JavaExec) {
mainClassName = 'your.entire.package.classContainingYourMainMethod'
}
以下のコードをアプリケーションに追加して解決しました。
//ここにコードを入力します。これは、build.gradleを実行したときに取得していたエラーです。メインクラス名が設定されておらず、解決できませんでした
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
Gradle build by byを実行することでこれを修正しました(またはgradle buildフォルダーを手動で削除します)
これは、メインクラスを新しいパッケージに移動し、古いメインクラスがclaspathでまだ参照されている場合に発生します
このエラーが発生したのは、パッケージにクラスがなかったためであったためです。 HelloWorld.Java
ファイルを「パッケージ」フォルダーに入れます。新しいパッケージフォルダーを作成する必要がある場合があります。
hello
フォルダーを右クリックして、[新規]> [パッケージ]を選択します。次に、名前(例:com.example)を付けて、HelloWorld.Java
クラスをパッケージに移動します。
次のようなプロジェクト構造の場合
project_name/src/main/Java/Main_File.class
ファイルbuild.gradle
に、次の行を追加します
mainClassName = 'Main_File'
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