Java throwing ClassNotFoundExceptions despite the classes being on build path - java

I have two different java projects (I'll call them project 1 and Project 2 for simplicity's sake) loaded into eclipse, and project 1 is added to the build path of project 2. I have imported the only package in the src folder of project 1 into a test class for project 2, and within the code of that test class I have simple object declarations of classes from project 1 as such:
ProjectOneClass object = new ProjectOneClass();
This code compiles without error, the compiler recognizes that these classes are on the build path. When I run the code as a Java application via Junit4, though, the program throws ClassNotFoundExceptions when it comes across these lines of code. The code is supposed to print these ClassNotFoundExceptions to the error log, but for some reason nothing is being printed. I'm using a simple
try {
...
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
structure, so I don't know why it's not printing to the error log.
The JUnit printout is simply:
Junit execution complete
Summary: 4 succeeded, 3 failed.
The four that succeed do not reference the imported project 1 package.
I have tried all manners of changes to the build path configurations, and nothing has shown any promise of improvement. The only thing I can think might be able to fix this is the order of the build path as specified in the Order And Export tab of the build path configuration window. Right now the order is:
project 2 packages
EAR Libraries
JRE System Libraries
JUnit4
a few JAR files (c3p0, commons-codec, ojdbc6)
project 1
I don't know for sure if the problem lies here or elsewhere, though. If anyone can help me out with this, I'd be very grateful. Thanks for reading.

I figured out the issue. Project 1 relies on several JARs that Project 2 doesn't have as part of its build path. I figured that since Project 1 had those JARs set within its build path, it would still work fine. Upon creating instances of classes from Project 1, however, I found that Project 2 required these JARs in its own build path.
This would make sense to me if the classes I was instantiating were implementations/extensions of a class from one of these JARs, but they weren't.
Regardless, by adding a couple of JARs to Project 2 I fixed the problem. Thanks everyone.

You should set the Run Configuration for your Project 2 class file.
In Eclipse, you can right click -- Select Run As -- Run Configuration and then in the classpath tab, make sure Project 1 is added by clicking on Add Projects.

Let's narrow down the problem and see if it relates to a JUnit launch config, or a more general problem involving the two Eclipse projects.
Create a class in Project 2 with a main(String[]) method. In that method, reference one or more of the types in Project 1 that appear to be causing your CNFE's. Run this class using the Java Application launch configuration type. (I'm assuming from your post that you're having trouble with launches based on the "JUnit Test" Launch Configuration type.) Report back.
Also, I've seen some funny behavior using the JUnit Test launch configuration type with JUnit 4 tests of late, although I don't think it's totally broken. So you could try a JUnit 3 configuration.

Related

Could not find or load main class in vs code

The case:
I have created a complex java project (spring boot) with maven build in IntelliJ and I was able to run it, everything was working fine. Now, as IntelliJ hasn't a community edition with spring boot, I had to move to vs code. I didn't change anything in my project, I just opened the folder (which contains the pom.xml and the src folder) in vs code and let vs code load the java project (earlier I installed all the extensions like spring boot, java, etc. for vs code).
After vs code opened the project successfully, I wanted to run it in the main method by clicking the run text (I inserted the image, that you can see the folder structure):
But as stated above, I get the famous error. I reloaded the window, I cleared the workspace, I set the JAVA_HOME and CLASSPATH variables in the env variables and tried, tried, tried it again, but no success. What the hell can I do on top of that? It worked in IntelliJ, it should work in vs code too. I use java se17. Note, that if I start a new simple project, the program get's compiled and executed without any error.
Another curiosity is, if I try to load the maven dependencies, vs code says, that it can't create the dependency tree, but if I run the mvn dependency:tree command, I get all the dependencies and it says, that the build was successful.
What is going on here?
EDIT: my antivirus program blocked maven, so, the problem with the dependency tree is now gone, but the error with the classpath remains.

Eclipse project contains a warning mark ... why?

The following red x suggests something is wrong.
Meanwhile
Project contains no errors and compiles fine
Project contains no path conflicts
Project includes all files it needs to know about
All tests pass when ran
Code works when executed
What would cause the red x and how can i remove it?
Try looking in the problems view for a detailed breakdown of build problems and warnings:
http://help.eclipse.org/helios/index.jsp?topic=%2Forg.eclipse.platform.doc.user%2Fconcepts%2Fcprbview.htm
There could be a whole range of problems related to your project without being specific to your source code. You might not have an expected jar on your build path - for example.
It could be a problem with the project itself. For example, you have a library defined in your build path and the library doesn't actually exist on disk.
Try right-click on project > Build Path > Configure build path > Libraries and look for problems there.
If you are not actually using any classes from the missing library, your project would still build, which would explain what you're seeing.

How do I run JUnit from NetBeans?

I've been trying to understand how to start writing and running JUnit tests.
When I'm reading this article:
http://junit.sourceforge.net/doc/testinfected/testing.htm
I get the the middle of the page and they write, "JUnit comes with a graphical interface to run tests. Type the name of your test class in the field at the top of the window. Press the Run button."
I don't know how to launch this program. I don't even know which package it is in, or how you run a library class from an IDE.
Being stuck, I tried this NetBeans tutorial:
http://www.netbeans.org/kb/docs/java/junit-intro.html
It seemed to be going OK, but then I noticed that the menu options for this tutorial for testing a Java Class Library are different from those for a regular Java application, or for a Java Web App. So the instructions in this tutorial don't apply generally.
I'm using NetBeans 6.7, and I've imported JUnit 4.5 into the libraries folder. What would be the normal way to run JUnit, after having written the tests?
The JUnit FAQ describes the process from the Console, and I'm willing to do that if that is what is typical, but given all that I can do inside netbeans, it seems hard to believe that there isn't an easier way.
Thanks much.
EDIT: If I right-click on the project and select "Test" the output is:
init:
deps-jar:
compile:
compile-test:
test-report:
test:
BUILD SUCCESSFUL (total time: 0 seconds)
This doesn't strike me as the desired output of a test, especially since this doesn't change whether the test condition is true or not.
Any ideas?
One way is to right click on your project in the Projects pane and select "Tests". That will run the JUnit tests. You can also right click on the test file and select "Run Test" and that single file will be ran. The keyboard shortcuts depends on how you have your keymapping set, but you'll see them in the context menus.
You can also have NetBeans autogenerate tests for you by right clicking your source file and then "Tools > Create JUnit Tests".
Re-importing does not appear to be necessary. I had the same issue (imported project, right clicking did not bring up any JUnit test options). I took these steps, which resolved it, using NetBeans 6.8:
Add a folder called "tests" to your project.
Right-click your project and select Properties.
Select Sources.
Under Test Package Folders, click the Add Folder button, and select the "tests" folder.
Right clicking a file + Tools > Create JUnit Tests.
Once a test is created, right-clicking a file + Test File runs the test.
All the above answers are correct, but if you are using in mac little change needed.
Step 1 Write your junit class.
Step 2 Right click on the class ->Tools-> Create/Updates Tests-> Select framework as Junit-> click ok.
Step 3 Right click on the file again ->Test File.
Now it will run as junit, will show the Test Result.
Even though I've accepted an answer, I thought I should mention my difficulty, as someone else may encounter it.
When importing a project from existing sources into NetBeans, if you do not specify a folder for test packages, then NetBeans will not offer the JUnit options on the tools menu.
The only solution I found was to re-import the project. While primitive, it worked.
I had the same issue after imported a eclipse project into NetBeans.
To resolve it, I followed the above steps outlined by alangalloway, but instead of
creating a new folder, I just pointed to the imported test folder.
Maybe in future release, NetBeans can automatically recognize imported test cases.
Thanks.
Had a similar issue. In Netbeans 7.0.1, what worked for me was to locate the project.xml file (i.e. {project}/nbproject/project.xml) and change:
<test-roots/>
to:
<test-roots>
<root id="src.dir"/>
</test-roots>
(in my case the test files are in the same dir as the source dir)

Class file not found in IntelliJ

In IntelliJ I get this weird error when I try to compile.
Cannot find annotation method 'cascade()' in type 'javax.persistence.ManyToOne': class file for javax.persistence.ManyToOne not found
I know, it seems pretty obvious what the problem is, but having spent too much time on this problem I now turn my trust to you!
I use ideaCommunity-9, where I have created a global library for JBoss, which contains all JBoss jars including ejb3-persistence.jar. My module includes this library, and I have moved it to the top of dependencies.
No otherwhere in classpath I have a javax.persistence.ManyToOne class, and it also opens up in IntelliJ without problems.
If I open the file where I get the compile error, IntelliJ shows no problems and also navigates to the class file on pressing Ctrl+B.
The code is also build with ant and here it works fine.
Besides the above error I get six others along the same path (name in Table, etc.) - all related to JPA. I also get a message saying "Please file a bug to JDC yada yada yada."
Try to tick a checkbox "export" in your dependencies.
I mean: "File" menu -> Project Structure -> Modules -> Dependencies, and there you can see libs included to the module. You should also see a checkbox near each lib in column 'Export'.
Just got this myself but non of those things were my issue. I downloaded a project from github, then opened in intelli J with the problem after trying to run a junit test.
Solution: Project Structure -> Modules -> 'Project_Name' -> Sources (tab) -> click src folder -> Mark as: Sources
This should highlight src to be blue and all the class files should be the circles with C instead of looking like normal files. Try running a test again and see if that does it.
I'm sure, it is too late to answer, but I had to follow a different approach for this error to resolve this issue.
I had to create this as global library and add that library to the module, then only the error is resolved.
Isn't that similar to this SO question?
The solution there was to add all JBoss jar (which you did), but also all persistent-related libraries (like Hibernate)
See this JBoss project configuration for example:
alt text http://jdick.co.uk/blog/wp-content/uploads/2008/12/projectstructure1.jpg
In short, ejb3-persistence.jar might not be the problem here, just a symptom of other elements missing.
Or, if it is the problem, it may be related to the fact that it is not deployed correctly (for the WebApp configuration).
Here's an idea:
Maybe you have multiple versions of your jar file.
Search your folder hierarchy for the file ejb3-persistence.jar,
using a file management tool such as Total Commander.
Multiple appearances of the file in your classpath may confuse IntelliJ Idea
into not recognizing the proper class in the proper jar.
had a similar problem ("cannot find class spring...DefaultResourceLoader even though it was in my maven dependencies) and no amount of tweaking of revalidating caches seemed to help. Blowing away my $HOME/.Idea* paths and (basically) starting from scratch fixed it for me. At least for now...
I was getting the class not found error message when trying to execute a .groovy test class, which referenced a .groovy file (located in the root of the source directory of a submodule - i.e. no packages).
Moving the source file .groovy into a package, fixed the issue for me.
Move:
src/main/groovy/RunMe.groovy
to
src/main/groovy/somePackage/RunMe.groovy
In intelliJ I got this problem when I built (ctrl+shift+F9) at the file level.
The reason is, I had changes in other files in the same maven project, that were not getting picked.
I solved it by building at the project level (Select the Maven project in intellij and press ctrl+shift+F9)

Eclipse - java.lang.ClassNotFoundException

When trying to start my JUnit-Test out of Eclipse, I get a "ClassNotFoundException". When running "mvn test" from console - everything works fine. Also, there are no problems reported in Eclipse.
My project structure is the following:
parent project (pom-packaging)
Web project (war-packaging - my JUnit-test is in here)
Flex project
Configuration project
edit: How can the class not be found? It's a simple HelloWorld-Application with no special libraries.
Here's my JUnit's run-configuration:
alt text http://www.walkner.biz/_temp/runconfig.png
Testclass (but as I said; it doesn't work with a simple HelloWorld either...):
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import biz.prognoserechnung.domain.User;
import biz.prognoserechnung.domain.UserRepository;
import biz.prognoserechnung.domain.hibernate.UserHibernateDao;
public class UserDaoTest {
/**
* the applicationcontext.
*/
private ApplicationContext ctx = null;
/**
* the user itself.
*/
private User record = null;
/**
* Interface for the user.
*/
private UserRepository dao = null;
#Before
public void setUp() throws Exception {
String[] paths = { "WEB-INF/applicationContext.xml" };
ctx = new ClassPathXmlApplicationContext(paths);
dao = (UserHibernateDao) ctx.getBean("userRepository");
}
#After
public void tearDown() throws Exception {
dao = null;
}
#Test
public final void testIsUser() throws Exception {
Assert.assertTrue(dao.isUser("John", "Doe"));
}
#Test
public final void testIsNoUser() throws Exception {
Assert.assertFalse(dao.isUser("not", "existing"));
Assert.assertFalse(dao.isUser(null, null));
Assert.assertFalse(dao.isUser("", ""));
}
}
I've come across that situation several times and, after a lot of attempts, I found the solution.
Check your project build-path and enable specific output folders for each folder. Go one by one though each source-folder of your project and set the output folder that maven would use.
For example, your web project's src/main/java should have target/classes under the web project, test classes should have target/test-classes also under the web project and so.
Using this configuration will allow you to execute unit tests in eclipse.
Just one more advice, if your web project's tests require some configuration files that are under the resources, be sure to include that folder as a source folder and to make the proper build-path configuration.
Carlos approach helped!
Eclipse - java.lang.ClassNotFoundException
Try to check the classpath of the junit run configuration:
Open your run configurations
Click on the jUnit-Test you want to start
go to the classpath tab
Try to add a folder (click on user entries, click on advanced, click on add folders, click on ok and search the outputfolder for your test classes(those you find under projektproperties java build path, source))
works for me.
your build classpath is correct, which is why you can compile. the classpath for your JUnit needs to be checked. go to the Run menu and choose 'open run dialog.' in there you should see a tree on the left with JUnit as an option. open that node and find and select your test. on the right pane you will see a tab for classpath. take a look to ensure that your class that the test is trying to instantiate would be found.
edit:
this seems to be an issue with maven and its behavior after a release changed the default Eclipse output folders. i have seen solutions described where
placing maven into the bootclasspath ABOVE the jre works, or
running mvn clean test does the trick or
refreshing all of your eclipse projects, causing a rebuild fixes the problem
going to your project and selecting Maven->Update Configuration solve the problem
with the first three, there were reports of the issue recurring. the last looks best to me, but if it doesnt work, please try the others.
here and here is some info
Enabling [x] Use temporary JAR to specify classpath (to avoid classpath length limitations) inside the Classpath tab of the Run configuration did the trick for me.
If your project is huge and you have lots of dependencies from other sibling projects and maven dependencies, you might hit the classpath length limitations and this seems to be the only solution (apart from making the directory to you local maven repo shorter (ours already starts at c:/m2)
The problem might be missing the class file in your build folder. One solution is clean the project and rebuild it.
There are many convoluted suggestions here.
I've encountered this problem multiple times with Maven projects after moving resources around by drag 'n' drop, or performing refactoring of class names.
If this occurs, simply copy (not move) the problem Test Case (.java) via terminal/file browser to another location, right-click -> Delete in Eclipse and choose to delete on disk when given the option, move/copy the copied file to the original file location, then select your project in Eclipse and press F5 to refresh resources.
This is quick and easy to do, and has fixed the problem permanently for me every time.
This was my solution to the problem. Of course, many things can cause it to occur. For me it was that Maven2 (not the plugin for Eclipse) was setting the eclipse profile up to use a different builder (aspectJ) but I did not have the plugin in eclipse./
http://rbtech.blogspot.com/2009/09/eclipse-galileo-javalangclassnotfoundex.html
Cheers
Ramon Buckland
Sachin's right:
Even with correct class path, the problems tab will show that some dependency or the Resource/project has error that needs to be fixed in order for maven to automatically build and create classes when you create or make a change in your test class.
"Hi,
Its very Old Jul (which year) but I had the same problem .
Actual issue found that eclipse was not able to generate class file for the java file , classpath was proper.
See the problem tab and check if your project is missing something/file. you can create a new proj and add files one by one and build them until it stops compiling and creating classes ( check the workspace/proj/bin/package/ folder for classes )
its wierd but true , ecplise was failing in compliation because 4 of 20 java files were using a single image which was missing. and as result none of the java file was compiled .
CLASSPATH is not a issue here."
We had the exact exception (using SpringSource Tools, tomcat, on Win7) and the cause was that we had refactored a filename (renamed a file) from SubDomain.java to Subdomain.java (D vs d) and somehow it collided though SpringSource was showing the new name Subdomain.java. The solution was to delete the file (via SpringSource) and create it again under the name Subdomain.java and copy-pasting its former content. Simple as that.
I had the exact same problem but I figured it out! Go to your project file and right click on it, then click Refresh or hit F5. Then try and run it. If it still doesn't work then just forget it, as I had the EXACT same problem and it just means you version of Eclipse is garbage.
JUnit test from inside eclipse gave me also NoClassDefFoundError.
Running 'mvn clean test' from command line gave me following error on several jars:
invalid LOC header (bad signature)
Deleting these jars from local m2 repository and running 'mvn clean test' again
solved my problem.
click on project->properties->Java build path->Source and check each src folder is still valid exist or recently removed. Correct any missing path or incorrect path and rebuild and run the test. It will fix the problem.
All I did was Properties -> Java Build Path -> Order and Export -> Enabled all unchecked boxes -> moved Junit all the way up
Tried
Link : [here][1]
Open your run configurations
Click on the jUnit-Test you want to start
go to the classpath tab
Try to add a folder (click on user entries, click on advanced, click on add folders,click on ok and search the outputfolder for your test classes(those you find under projektproperties java build path, source))
worked after
Maven 2 LifeCycle >> test
I had tried all of the solutions on this page: refresh project, rebuild, all projects clean, restart Eclipse, re-import (even) the projects, rebuild maven and refresh. Nothing worked. What did work was copying the class to a new name which runs fine -- bizarre but true.
After putting up with this for some time, I just fixed it by:
Via the Run menu
Select Run Configurations
Choose the run configuration that is associated with your unit test.
Removing the entry from the Run Configuration by pressing delete or clicking the red X.
Something must have been screwed up with the cached run configuration.
I had the same problem. All what I did was,
i). Generated Eclipse artifacts
mvn clean eclipse:eclipse
ii). Refresh the project and rerun your junit test. Should work fine.
while running web applications Most of us will get this Exception. When you got this error you have place .class files in proper folder.
In web applications all .class files should sit in WEB-INF\Classes folder.
if you are running web app in Eclipse please follow the steps
Step 1: Right click on Project folder and Select Properties
Step 2: Click on "Java Build Path" you will see different tabs like "source" , "projects", "libraries" etc
Step 3: select Source folder. under this you will see your project details
Step 4: in the "Source" folder you will see Default Output Folder option. here you have to give the classes folder under WEB-INF.
just give the path like projectname/WebContent/WEB-INF/classes
the structure depends on your application
please do remember here you no need to create "classes" folder. Eclipse will create it for you.
Step 5: click on "OK" and do the project clean and Build. that's it your app will run now.
I solve that Bulit path--->libraries--->add library--->Junit check junit4
Usually this problem occurs while running java application java tool unable to find the class file.
Mostly in maven project we see this issue because Eclipse-Maven sync issue. To solve this problem :Maven->Update Configuration
I suggest trying adding this to the VM arguments;
-verbose:class -verbose:module -Xdiag
Then you can debug it from Eclipse which should print out some message like;
java.lang.ClassNotFoundException: org.adligo.somewhere.Foo
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:398)
at java.base/sun.launcher.LauncherHelper.loadMainClass(LauncherHelper.java:760)
at java.base/sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:655)
From this you can set a breakpoint on LancherHelper.java 760 to debug the Eclipse Lanucher itself. In my case I noticed that user classpath appeared to be null, even though I have many jars in it in the Lanuch config.
Make sure if your test class working before , but you facing issue all of sudden. then clean your project and build it again. Make sure project has been configured in build path as read above article.
Well, you can solve this problem basically by creating a new project.
Close the project (save the code in another folder on your computer).
Create a new project (add a new final directory and do not leave the default directory selected).
Remake your previous project adding the code saved before.
This happens because probably you created a project and didn't select a directory/folder or something like that.
I hope had helped you!
Please point to correct JDK from Windows > Preferences > Java > Installed JRE.
Do not point to jre, point to a proper JDK. I pointed to JDK 1.6U29 and refreshed the project.
Hereafter, the issue is gone and jUnit Tests are working fine.
Thanks,
-Tapas
I've run into a same error in Eclipse recently, i.e., the Eclipse IDE couldn't find the Unit test class no matter how I change the configurations. Learning from the previous posts here and in other web sites, I've double checked and triple checked the classpath and source info, and move up and down the source folder and libraries, in both the "Run Configuration" and the "Java Build Path" config windows, and I've also cleaned the Project and rebuilt it, but none of the tricks work for me. The specific Java project is an old ANT compiled project and have lots of jars included in Eclipse library.
Then, I changed the unit test class to add a main() method and right click it to "Run As" a Java Application instead of JUnit test, and suddenly, Eclipse seems to wake up and identified the class correctly. Afterwards, I switched it back to a Unit test application, and it is still working.
This seems to be a bug in Eclipse, I am guessing the large number of libraries (>260) may confused the JVM's ability to locate my JUnit class.
I was hit with this issue also and was able to come up with a sufficient solution for my case. If your Eclipse project has a .classpath file in your project root (see it in Navigator view instead of Package Explorer view), be sure that your Maven classpathentry appears prior to your JRE Container classpathentry.
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
</classpath>
If your project does not have a .classpath file, you can edit your project's Java Build Path to switch the Order and Export. If your project has the .classpath file and you only change your ordering in the Java Build Path, you will see that the ordering is not impacted and the issue will continue to occur.
And a project->clean never hurts things after you make the change.
Make sure your test launch configuration does NOT contain the following lines, OR try enabling automated Maven dependency management.
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.maven.ide.eclipse.launchconfig.classpathProvider"/>
<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.maven.ide.eclipse.launchconfig.sourcepathProvider"/>
I tried everything I read in this long post and, incredibly, what worked for me was, rather than clicking on the test class and selecting Run as JUnit test, clicking on the test method and running as JUnit test. I have no idea why?
Deleting the project from eclipse (Not from hard disk) which in a way is cleaning the workspace and reimporting the project into eclipse again worked for me.
Changing the order of classpath artifacts in the Java Build Path resolved it for me.
Right Click on the project and go to Project Build path.
Go to, Order and Export tab and move the JRE system library to after the sources.
This should fix it.
JUnit 4.4 is not supported by the JMockit/JUnit integration. Only
versions 4.5 or newer are supported that.

Categories

Resources