java.lang.NoClassDefFoundError: Could not initialize class XXX
Asked Answered
P

10

231
public class PropHolder {
  public static Properties prop;

  static {
    //code for loading properties from file
  }
}

// Referencing the class somewhere else:
Properties prop = PropHolder.prop;

class PropHolder is a class of my own. The class resides in the same JAR file of the main class. So that should not because any JAR is missing from classpath.

When I look in to the JAR file by jar tf myjarfile, I can see the PropHolder.class listed there.

Btw: the code is running fine on my local machine. But couldn't work when I deploy it with some script onto a Linux server. So I think it is not the problem of the code. But for some reason. the deploy process is very hard to track.

What could be the problem?

Panic answered 6/9, 2011 at 20:12 Comment(3)
Is the appropriate directory structure in your jar to match the class package?Hibbard
need to see some source, many things can cause this. for example, a 'package' statement but the file not actually residing in the corresponding pathBilocular
One cause is an exception during initialization--is there any other error output?Playacting
S
286

My best bet is there is an issue here:

static {
    //code for loading properties from file
}

It would appear some uncaught exception occurred and propagated up to the actual ClassLoader attempting to load the class. We would need a stacktrace to confirm this though.

Either that or it occurred when creating PropHolder.prop static variable.

Spherule answered 6/9, 2011 at 20:35 Comment(11)
I have been facing the same problem time and again. I am sure that it is because of the static issue. What needs to be done to resolve the problem?Hooten
You will need to identify what exception is being thrown from the static block. To debug it put a try/catch(Exception e) around the entire block and log the exception. You'll have to fix that exception. Typically the exception will be logged but may be hard to find since it's being logged during classloading which may happen very earlySpherule
Yes I kept the code in try catch block and it said Failed to initialize ClassA. I think it is the problem of JVM. I restarted my system and then everything worked fine. How do I resolve this problem in future without restarting my system and solve the problem with a simple solu4tion.Hooten
Failed to initialize ClassA is a side effect from something else. You will want to look at the cause if available. A NoClassDefFoundError is always associated to another error, you will need to look for it in the logs or try to log it more appropriately (like force the logging into a new file on the file system)Spherule
It would be more easily traceable if Java would throw an error CouldNotInitializeStaticPartOfClassError or something. Then we as developer would know where to look.Scopula
@Scopula Good point. This is what I've noticed of error logging as a whole that it could be more specific and point the developer at what the actual issue isSemidome
I have the same issue. Some properties are read in the static initializer block. One property that is newly added into the properties file causes this problem. After restart the application server the problem is disappeared. I think the properties file is loaded only during the start of the application server.Suttee
@Suttee That's right. The static tantalizer is only executed once per Java classloading which for most applications will be once per application run. You would need something like a FileChangedReloadingStrategy. Java also introduced a WatchServiceSpherule
I was getting the same issue due to mismatch with the properties file key name and used in my code. After fixing the properties file problem got resolvedFootstalk
If the code in the static block doesn't swallow the exception (if it did, then there should be no problem loading the class), shouldn't you get an ExceptionInInitializerError? What if you're getting this NoClassDefFoundError but there's no ExceptionInInitializerError nor ClassNotFoundException in the stack trace?Shorttempered
I had the same problem. Inside the static block I was trying to add elements to a null mapEreshkigal
K
162

You are getting a java.lang.NoClassDefFoundError which does NOT mean that your class is missing (in that case you'd get a java.lang.ClassNotFoundException). The ClassLoader ran into an error while reading the class definition when trying to read the class.

Put a try/catch inside your static initializer and look at the exception. If you read some files there and it differs from your local environment it's very likely the cause of the problem (maybe file can't be found, no permissions etc.).

Kayne answered 6/9, 2011 at 20:35 Comment(7)
one clarifaction is that even though NoClassDefFoundError does not imply a ClassNotFoundException, it is still a possible cause of the NoClassDefFoundError.Spherule
buf if you had a ClassNotFoundException then the ClassLoader would / could never try load the class, right?Kayne
A class can be loading another class that was not found. The cause in that instance is still a ClassNotFoundExceptionSpherule
I should've clarified, I just meant an exception.getCause()Spherule
@nterry what was your issue??!!Tosh
@Tosh i think it was a set of conflicting dependencies. Using a maven exclusion, i was able to get the right version loadedCalcine
This one was really helpful here, since I've spent about 20 mins verifying the JAR (the reported class belongs to) is included. Once I realized I'm looking into wrong direction, I easily understood that likely some annotation class is missing and voila, the reported one was declared as @Stateless, so I just added the corresponding dependency and was able to proceed further. Thanks for the tip!Alessi
S
41

NoClassDefFoundError doesn't give much of a clue as to what went wrong inside the static block. It is good practice to always have a block like this inside of static { ... } initialization code:

static {
  try {

    ... your init code here

  } catch (Throwable t) {
    LOG.error("Failure during static initialization", t);
    throw t;
  }
}
Salesclerk answered 19/5, 2012 at 16:38 Comment(2)
How to do this in kotlin?Broca
Thanks for giving the hint. In my case I was getting NPE on static line initialization.Spurgeon
H
5

I had the same exception, this is how I solved the problem:

Preconditions:

  1. Junit class (and test), that extended another class.

  2. ApplicationContext initialized using spring, that init the project.

  3. The Application context was initialized in @Before method

Solution:

Init the application context from @BeforeClass method, since the parent class also required some classes that were initialized from within the application context.

Hope this will help.

Hubsher answered 17/7, 2014 at 8:38 Comment(0)
M
3

As mentioned above, this could be a number of things. In my case I had a statically initialized variable which relied on a missing entry in my properties file. Added the missing entry to the properties file and the problem was solved.

Manganite answered 17/12, 2014 at 19:46 Comment(0)
P
2

Just several days ago, I met the same question just like yours. All code runs well on my local machine, but turns out error(noclassdeffound&initialize). So I post my solution, but I don't know why, I merely advance a possibility. I hope someone know will explain this.@John Vint Firstly, I'll show you my problem. My code has static variable and static block both. When I first met this problem, I tried John Vint's solution, and tried to catch the exception. However, I caught nothing. So I thought it is because the static variable(but now I know they are the same thing) and still found nothing. So, I try to find the difference between the linux machine and my computer. Then I found that this problem happens only when several threads run in one process(By the way, the linux machine has double cores and double processes). That means if there are two tasks(both uses the code which has static block or variables) run in the same process, it goes wrong, but if they run in different processes, both of them are ok. In the Linux machine, I use

mvn -U clean  test -Dtest=path 

to run a task, and because my static variable is to start a container(or maybe you initialize a new classloader), so it will stay until the jvm stop, and the jvm stops only when all the tasks in one process stop. Every task will start a new container(or classloader) and it makes the jvm confused. As a result, the error happens. So, how to solve it? My solution is to add a new command to the maven command, and make every task go to the same container.

-Dxxx.version=xxxxx #sorry can't post more

Maybe you have already solved this problem, but still hope it will help others who meet the same problem.

Proa answered 28/10, 2015 at 3:51 Comment(1)
What's more, when the code runs on the linux machine, follow the error above, there is another problem : java.lang.ExceptionInInitializerError: null, it means that can not find the class in the classloader, or don't know to load which one(I guess). Did you meet that?Proa
A
1

If you're working on an Android project, make sure you aren't calling any static methods on any Android classes. I'm only using JUnit + Mockito, so maybe some other frameworks might help you avoid the problem altogether, I'm not sure.

My problem was calling Uri.parse(uriString) as part of a static initializer for a unit test. The Uri class is an Android API, which is why the unit test build couldn't find it. I changed this value to null instead and everything went back to normal.

Angelineangelique answered 12/12, 2016 at 23:47 Comment(0)
E
1

I had the same exception - but only while running in debug mode, this is how I solved the problem (after 3 whole days): in the build.gradle i had : "multiDexEnabled true" set in the defaultConfig section.

        defaultConfig {
    applicationId "com.xxx.yyy"
    minSdkVersion 15
    targetSdkVersion 28
    versionCode 5123
    versionName "5123"
    // Enabling multidex support.
    multiDexEnabled true
}

but apparently this wasn't enough. but when i changed:

public class MyAppClass  extends Application 

to:

public class MyAppClass  extends MultiDexApplication 

this solved it. hope this will help someone

Exponible answered 31/10, 2018 at 10:0 Comment(0)
B
0

Thanks for the question and hints from the top voted answers. It makes me rethink about static fields and at last, I found that I defined a DateTimeFormatter which needs another static constant to be created; seems that String being constant is fine but DateTimeFormatter cannot be created at class init time.

private static final String PATTERN = "yyyy-MM-yyThh:mm:ss.SSSSSSV"; // OK
private static DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern(PATTERN); // WRONG; as it depends on another field to be created first

The solutions are:

  • initialize the DateTimeFormatter in a @PostConstruct method
  • or in the method where it is needed.
Barmecidal answered 4/5, 2023 at 8:35 Comment(0)
B
-1

Adding these import statements resolved the issue:

import org.junit.runner.RunWith;

import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber;
Brahmanism answered 10/1, 2022 at 12:22 Comment(1)
Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.Larva

© 2022 - 2024 — McMap. All rights reserved.