IntelliJ: How to resolve java.lang.ClassNotFoundException: main.java.org.***.Main - java

I'm using IntelliJ and the path to the directory that includes my source code is:
MyProjectFolder/src/main/java/org/***/
This directory includes a java file named Main.java, and in Run/Debug Configurations I have the path "/home/matan/Projects/java_phone_book/src/main" in Working directory field.
Still, when I run the program by IntelliJ, I get the error:
Exception in thread "main" java.lang.ClassNotFoundException:
main.java.org.***.Main
What can resolve this problem?

Your class' fully-qualified name is not main.java.org.***.Main. That is why the class main.java.org.***.Main can not be found.
If you are following a currently popular project layout, then 'main' and java are not part of the package name for your class. Try org.***.Main instead. (although asterisks are not a valid package name, so what you posted can't actually be it)
Otherwise, you'll need to go back to review your CLASSPATH, your package declarations, and your project layout and ensure they all agree with each other.

Go to the menu File > Project Structure. Click the "Modules" section, then click your module name, then click the "Sources" tab. One of the folders shown should be marked as a "Source Folder" already. I will call the name of this folder "S". Make sure Main.java is somewhere in one of the sub-folders of S.
Now, find the full directory path of Main.java. This should be something like S/<some_path>/Main.java. If the beginning of <some_path> is "java" then you should rename that directory to something else. Finally, in Main.java, change the first line of the code so that it says package <some_path>; Replace <some_path> with the one you found in the last step. Replace the slashes with dots.

Related

Intellij doesn't recognize package

i got this sample solution from my Professor, but somehow it isn't working.
IntelliJ does not recognize the packages. That's the case for every class.
When I hover over it it says:
"Package name 'spaceman.view.util' does not correspond to the file path 'view.util' "
Has anyone any idea what could be wrong?
I'm a total beginner when it comes to coding so sorry, if the question is banal.
Thank you!!
Your project spaceman is the sources root. That means anything inside a folder view/welcome in that folder is supposed to be in the package view.welcome. If you want to keep the package spaceman.view.welcome then move the whole tree into another folder spaceman inside your spaceman project directory.
Note that it's rather unusual to have the project root itself be the source root. It's way more common to have a directory like src/ be the source root (or, if you follow the Maven/Gradle convention something like src/main/java).

Main.java is not on the classpath of project NewProject_880753af, only syntax errors are reported - Java(32)

Yesterday I opened VS Code after a month or so, and I noticed, that all my projects' Java files can't run. I see a light blue curved underline under the first letter in all my Java files, which says:
Main.java is not on the classpath of project NewProject_880753af, only syntax errors are reported - Java(32)
I have my Java file inside "src" directory inside my project directory "NewProject".
When I try to run my file, it then prompts me to add the parent folder to some Java source path:
The file Main.java isn't on the classpath, the runtime may throw class not found error. Do you want to add the parent folder "NewProject/src" to Java source path?
Then it gives me two options - "Add to Source Path" or "Skip". If I press "Skip", it shows an error again:
Cannot resolve the modulepaths/classpaths automatically, please specify the value in the launch.json.
If I choose "Add to Source Path", then it creates a folder called ".vscode" with a file "settings.json" in which there's the following code:
{
"java.project.sourcePaths": [
"src"
]
}
And after that it works... but... I just don't understand - why did Visual Studio Code fail to run my file even if it was working everytime I ran it in the past and without any prompts to add my parent folder to source path or anything?? And I didn't need any "launch.json" files!
How can I fix this problem without creating any new folders inside my project directory?

Declaring packages in eclipse

I'm new to java and eclipse and was wondering if someone could help me.
In my comp class we have a lab each week so in eclipse I created a folder called "compClass" in this file is the "src" folder and in that folder are 3 packages. lab1, lab2, lab3, one for each week we have an assignment. We're currently on assignment 3 so I'm using "lab3" package. In this package I have 2 files, "Test.java" and "MyInteger.java". These files were given to the students and we are supposed to modify them, however that's not my issue.
My issue is on those files I keep getting a compiler error that says: The declared package "" does not match the expected package "lab3" I'm not sure why this is happening as I didn't import anything. I created new java files and copy pasted the code in from a text file. I even tried typing it out by hand and got the same error. I tried dragging and dropping the "Test" and "MyInteger" files (as java files not text files) from a folder on my desktop to the "lab3" package and got the same error. How can I fix this?
P.S. On this post: https://stackoverflow.com/questions/7628686/eclipse-the-declared-package-does-not-match-the-expected-package/13444301#:~:text=java%20files%20to%20%22package%20path,All%20should%20be%20ok.&text=If%20you%20have%20imported%20an,the%20error%20till%20you%20restart.
The top answer said to find the src/prefix1 directory and right click on it. Then build path and use as source folder. If that is the answer then could someone please help me find the "src" directory I don't even really know what that is or where to find it.
Thank you!
Every Java project has a project root which can be configured using your IDE. In your case, the root is src/. If your code is inside a subfolder in the root, this folder represents the package your code belongs to, so in this case it's a package of lab3. If you want to not include any package declarations, then either place the code directly inside src or set lab3 as the root.

Is source file and a package the same thing in Eclipse?

I am a complete beginner when it comes to Java. I recently picked up Head First Java and it says: "Put a class in a source file. Put methods in a class. Put statements in a method." When I open eclipse i started a new project called helloWorld, this created a project with a src folder(guessing this is the source file?), i then followed an eclipse tutorial from their website and it stated that i needed to first create a project, then a package, then a class in that package. What is the difference between a source file and a package?
A package more-or-less equates to a directory under your "src" folder in this case. Examples might include "com.project.ui" or "com.project.models" (and so there would be a "com" directory inside "src" and inside "com" you would have "project" and so on).
A source file is just that--it's an individual file that will live in one of those packages, probably named as "MyClass.java" where "MyClass" corresponds exactly to the name you give the one public class that the source file should contain.
BTW, if you will build your code with Maven, you should follow the suggested Maven directory structure--see this. In the case of Maven then, your java packages would start under "src/main/java" rather than under just "src" which is maybe what Eclipse will assume you want by default.
EDIT: Also take care to align the package you declare at the top of your Java source file with the package that it actually "lives in" on your filesystem--it's essential that these be in agreement. So, if your "MyClass.java" lives on the filesystem in com/projects/models, your package statement at the top of "MyClass.java" must be "package com.projects.models;" By convention package names will be all lowercase, class names will be upper and lower ("camel case") starting with a capital letter and method names start with a lowercase letter, but then are also camel case.
The following is a java source text:
package org.apache.twinkle;
public class Elfie {
...
}
It resides under a sources directory (generally src), and has a file path:
org/apache/twinkle/Elfie.java
(Directories org, apache, twinkle and file Elfie.java.)
So a package indicates some hierarchy and corresponds 1:1 with a directory.
The source file has a .java extension.
Paths should be case-sensitive. Package paths are hierarchical and generally follow the convention of starting with a reversed URL.
http://mit.com
package com.mit.mathlib.graphs;
http://univ-abu-dabi2.net
package net.univAbuDabi2.linguistics;
import com.mit.mathlib.graphs.GraphUtils;
Source file is complete Java code.
Package gather a several Java file under some issue like: GUI, server, login and etc.
Try to create several package and then go to the workspace to see what you got.
Also, when it comes to package issues, you also have the 'package' definition for class variables, which means that you are able to use this variable from other classes in the same package.

Troubleshoot NoClassDefFoundError in Java

I have a Java program called Main.java, it is located in the following directory:
/home/user/program/Main.java
When I try to run Main.java from the 'program' directory, everything goes ok, I use this line:
/home/user/program$ java Main
But when I try to run Main.java from the home directory :
/home$ java /home/user/program/Main
I get :
Exception in thread "main" java.lang.NoClassDefFoundError: /home/user/program/Main
Caused by: java.lang.ClassNotFoundException: .home.user.program.Main
What is the cause of this error?
This is due to your classpath, which will default to the current directory. When you run java Main from /home/user/program it finds the class in the current directory (since the package seems to be unset, meaning it is the default). Hence, it finds the class in /home/user/program/Main.class.
Running java /home/user/program/Main from /home tries to find the class in the classpath (the current directory) which will look in /home/home/user/program expecting to find the file Main.class containing a definition of the Main class with package .home.user.program.
Extra detail: I think the java
launcher is trying to be nice by
converting /-notation for a classname
to the .-notation; and when you run
java /home/user/program/Main it is
actually running java
.home.user.program.Main for you. This
is because you shouldn't be specifying
a file, but a fully specified
classname (ie including package
specifier). And when a class has a package
java expects to find that class within a
directory structure that matches the package
name, inside a directory (or jar) in the
classpath; hence, it will try to look in
/home/home/user/program for the class file
You can fix it by specifying your classpath with -cp or -classpath:
java -cp /home/user/program Main
Because its looking for the class using the fullname you give (/home/user/program/Main). You should only look for the Main class but using the good classpath :
java Main -cp /home/user/program
Which means it'll search the Main class in the given set of paths
Your 2nd command version does not know where to find the classes.
You need to provide the so called classpath
/home$ java -cp userprogram Main
Because of what you say I conclude this:
Main is in "top" (root) package
And when you execute java you must indicate the classpath, it is, the root directory where your pakage and classes structure is located.
In your case it is the very /home/user/program. And I guess your classpath is defined as "." (the dir you are located at). When you call java from home the classpath is being taken erroneosly.
If you want to call your main using a different package declare the package at the top of the class:
package user.program;
And set the classpath to /home (or execute java from that dir).
Next call java this way:
java user.program.Main
using dots because its a full class name (indicating packages). That is translated to dirs concatenating classpath + package + class. By example:
/home
user.program -> user/program/
Main -> Main.class
Good luck!
The problem is that if you call java /home/user/program/Main the package Main is in is meant to be home.user.program, which I assume is not true for Main (I assume it's in the default package, i.e. none at all). Is there a package declaration at the top of Main?
I'd suggest to use the classpath suggestions in the other answers.
This works for me:
java -cp /home/user/program Main
just a while ago faced this kind of error of (NoClassDefFoundError). I imported some third party library in my android app using eclipse env. I got this error during a runtime - some class from this third party library couldn't be found and a result of this NoClassDefFoundError was thrown, despite the mentioned library correctly appeared in classpath, so I really didn't know what else can be done to solve this problem.
While playing with "Order and Export" tab within "Java Build Path", I put my imported third party library to the top of the list of all libraries in my project and checked its checkbox - this solved the problem
I came across this same error when trying to compile and run it. The book, "Head First Java" explains and addresses this problem appropriately. Here is a screenshot from the book for your reference.
Hope its helpful.

Categories

Resources