Gradle - Could not find or load main class
JavaSpringGradlebuild.gradleJava Problem Overview
I'm trying to run a very simple project using Gradle and running into the following error when using the gradlew run command
:
> could not find or load main class 'hello.HelloWorld'
Here is my file structure:
SpringTest
-src
-hello
-HelloWorld.java
-Greeter.java
-build
-libs
-tmp
-gradle
-wrapper
-build.gradle
-gradlew
-gradlew.bat
I excluded the contents of the libs and tmp folders because I didn't think that would be relevant information for this issue, but I can add it in if need be.
Here is my build.gradle file:
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'
}
Any idea on how to fix this issue? I've tried all sorts of things for the mainClassName
attribute but nothing seems to work.
Java Solutions
Solution 1 - Java
I see two problems here, one with sourceSet
another with mainClassName
.
-
Either move java source files to
src/main/java
instead of justsrc
. Or setsourceSet
properly by adding the following to build.gradle.sourceSets.main.java.srcDirs = ['src']
-
mainClassName
should be fully qualified class name, not path.mainClassName = "hello.HelloWorld"
Solution 2 - Java
Modify build.gradle to put your main class in the manifest:
jar {
manifest {
attributes 'Implementation-Title': 'Gradle Quickstart',
'Implementation-Version': version,
'Main-Class': 'hello.helloWorld'
}
}
Solution 3 - Java
I just ran into this problem and decided to debug it myself since i couldn't find a solution on the internet. All i did is change the mainClassName to it's whole path(with the correct subdirectories in the project ofc)
mainClassName = 'main.java.hello.HelloWorld'
I know it's been almost one year since the post has been made, but i think someone will find this information useful.
Happy coding.
Solution 4 - Java
Just to make it clear for newbies trying to run a gradle project from Netbeans:
To understand this, you need to see what the main class name looks like and what the gradle build looks like:
Main class:
package com.stormtrident;
public class StormTrident {
public static void main(String[] cmdArgs) {
}
}
Notice that it is part of the package "com.stormtrident".
Gradle build:
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'
}
Solution 5 - Java
For Netbeans 11 users, this works for me:
apply plugin: 'java'
apply plugin: 'application'
// This comes out to package + '.' + mainClassName
mainClassName = 'com.hello.JavaApplication1'
Here generally is my tree:
C:\...\NETBEANSPROJECTS\JAVAAPPLICATION1
│ build.gradle
├───src
│ ├───main
│ │ └───java
│ │ └───com
│ │ └───hello
│ │ JavaApplication1.java
│ │
│ └───test
│ └───java
└───test
Solution 6 - Java
Struggled with the same problem for some time. But after creating the directory structure src/main/java and putting the source(from the top of the package), it worked as expected.
The tutorial I tried with. After you execute gradle build
, you will have to be able to find classes
under build
directory.
Solution 7 - Java
In my build.gradle, I resolved this issue by creating a task and then specifying the "mainClassName" as follows:
task(runSimpleXYZProgram, group: 'algorithms', description: 'Description of what your program does', dependsOn: 'classes', type: JavaExec) {
mainClassName = 'your.entire.package.classContainingYourMainMethod'
}
Solution 8 - Java
If you decided to write your hello.World
class in Kotlin, another issue might be that you have to reference it as mainClassName = "hello.WorldKt"
.
src/main/java/hello/World.kt:
package hello
fun main(args: Array<String>) {
...
}
// class World {} // this line is not necessary
Solution 9 - Java
I fixed this by running a clean of by gradle build (or delete the gradle build folder mannually)
This occurs if you move the main class to a new package and the old main class is still referenced in the claspath
Solution 10 - Java
When I had this error, it was because I didn't have my class in a package. Put your HelloWorld.java
file in a "package" folder. You may have to create a new package folder:
Right click on the hello
folder and select "New" > "Package". Then give it a name (e.g: com.example) and move your HelloWorld.java
class into the package.
Solution 11 - Java
-
verify if gradle.properties define right one JAVA_HOVE
org.gradle.java.home=C:\Program Files (x86)\Java\jdk1.8.0_181
or
- if it's not defined be sure if Eclipse know JDK and not JRE
Solution 12 - Java
I resolved it by adding below code to my application.
// enter code here this is error I was getting when I run build.gradle. main class name has not been configured and it could not be resolved
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
Solution 13 - Java
For a project structure like
project_name/src/main/java/Main_File.class
in the file build.gradle
, add the following line
mainClassName = 'Main_File'
Solution 14 - Java
If you're using Spring Boot, this might be the issue: https://github.com/gradle/gradle/issues/2489.
Basically, the output directories changed in Gradle 4.0, so if you have them hardcoded the execution will fail.
The solution is to replace:
bootRun {
dependsOn pathingJar
doFirst {
classpath = files("$buildDir/classes/main", "$buildDir/resources/main", pathingJar.archivePath)
}
}
by:
bootRun {
dependsOn pathingJar
doFirst {
classpath = files(sourceSets.main.output.files, pathingJar.archivePath)
}
}
Solution 15 - Java
I had forgotten to add String[] args
inside main method public static void main()
After changing it to public static void main(String[] args)
, everything worked.
My build.gradle
looks like this
apply plugin: 'java'
apply plugin: 'application'
mainClassName = 'hugo.HelloWorld'
Solution 16 - Java
For Kotlin DSL (build.gradle.kts) use this code:
tasks.jar {
manifest.attributes["Main-Class"] = "my.package.name.MyClassName"
// ...
}
Another similar notation:
tasks.jar {
manifest {
attributes["Main-Class"] = "my.package.name.MyClassName"
}
// ...
}