AWS Beanstalk + Kotlin + Spring boot: NoSuchMethodException main() - java

I've a Spring Boot app written in Kotlin that I have deployed to AWS Beanstalk that is throwing the following exception:
Exception in thread "main" java.lang.NoSuchMethodException: com.prototype.demo.DemoApplication.main([Ljava.lang.String;)
at java.base/java.lang.Class.getDeclaredMethod(Class.java:2675)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:47)
Locally, when I run the app from IntelliJ I've no issues.
I have the spring-boot-maven-plugin and the kotlin-maven-plugin in my project.
Any ideas about what could be causing the issue? I previously built a similar app in Java but didn't run into this issue.
Thank you for your expertise and time.
Update: something interesting to notice is that I had to set in the properties of my POM the following line in order to make the project executable by IntelliJ during development (i had forgotten about it): <start-class>com.prototype.demo.DemoApplication</start-class>
Now I've removed it and I get a different error when running the jar file. I will spend some time on it and see if that's related or not and update the question accordingly.
Thank you!

The issue was raised by the following property declared in my POM file: <start-class>com.prototype.demo.DemoApplication</start-class>.
Once I removed it and added the open keyword to the Configuration annotated classes and to the DemoApplication(the class containing the main) it finally worked.

Solution for build.gradle.kts
I had the same problem when deploying my application to ECS.
First things first:
When you see such an error in AWS logs -> do as the author of the question has done and test the issue locally. Most probably if the application is failing on AWS, it will also fail on you local machine. To do so, you build a jar locally, the jar file is usually saved in build/libs/application-x.x.x-SNAPSHOT.jar and run java -jar application-x.x.x-SNAPSHOT.jar
Now you can fix your build task and test it locally before deploying it again.
Fix Gradle:
My main method was defined in MyApplication.kt file, but in the definition of the main class in gradle I had to set the following:
tasks.getByName<org.springframework.boot.gradle.tasks.bundling.BootJar>("bootJar") {
mainClass.set("com.company.app.MyApplicationKt")
}
Notice: MyApplicationKt
That is the only thing I had to change for me to fix this issue.

Related

I am getting NoClassDefFound error when running with listeners included and getting passed without listeners

Getting
java.lang.NoClassDefFoundError error when running xml file using
testng.
Error details: java.lang.NoClassDefFoundError: Could not
initialize class com.listeners.ExtentTestManager at
com.listeners.Listeners.onTestFailure(Listeners.java:56)
I am using testng version 6.9.10 in pom.xml.
Hi, I am getting this error when I use listeners in my xml file. If I remove listeners and run the xml file, it is working. Please let me know if anything wrong with ExtentTestManager class or the dependencies. I am unable to add code in stackoverflow, so I have attached in this link: selenium99.com/java-lang-noclassdeffounderror Pls check.
You can try maven update project in eclipse after that use clean install, it should work.
Basically
NoClassDefFoundError can occur for multiple reasons like
ClassNotFoundException -- .class not found for that referenced class irrespective of whether it is available at compile time or not(i.e base/child class).
Class file located, but Exception raised while initializing static variables
Class file located, Exception raised while initializing static blocks
But in this case it looks like you are missing some dependency in the building.
you can try cleaning whole project and build again.
If it's a eclipse project
mvn clean eclipse:eclipse
mvn clean package
try above commands

Optaplanner - Error when running executable jar but works fine from eclipse

I use eclipse for my optaplanner project development and I am able to execute my code from eclipse without any problem. To make this project as an executable, I exported it as a jar file using eclipse export wizard.
Then I run my jar from terminal using the command java -jar myOptaPlanner.jar, then, I get below error
WARN given scan urls are empty. set urls in the configuration
Exception in thread "main" java.lang.IllegalStateException: The scanAnnotatedClasses
(ScanAnnotatedClassesConfig()) did not find any classes with a PlanningSolution
annotation.
Maybe you forgot to annotate a class with a PlanningSolution annotation.
Maybe you're using special classloading mechanisms (OSGi, ...) and this is a bug.
If you can confirm that, report it to our issue tracker and workaround it by
defining the classes explicitly in the solver configuration.
at org.optaplanner.core.config.domain.ScanAnnotatedClassesConfig.loadSolutionClass(ScanAnnotatedClassesConfig.java:106)
at org.optaplanner.core.config.domain.ScanAnnotatedClassesConfig.buildSolutionDescriptor(ScanAnnotatedClassesConfig.java:86)
at org.optaplanner.core.config.solver.SolverConfig.buildSolutionDescriptor(SolverConfig.java:270)
at org.optaplanner.core.config.solver.SolverConfig.buildSolver(SolverConfig.java:216)
at org.optaplanner.core.impl.solver.AbstractSolverFactory.buildSolver(AbstractSolverFactory.java:57)
at org.roster.app.WorkerRosteringApp.main(WorkerRosteringApp.java:36)
Is this really a bug or am I exporting it wrong?
Update: I tried to export jar using maven-shade-plugin and here also I am getting the same error.
Thanks
scanAnnotatedClasses doesn't seem to work in a jar file. Instead, use following workaround:
<solutionClass>path.to.your.SolutionClass</solutionClass>
<entityClass>path.to.your.EntityClassI</entityClass>
<entityClass>path.to.your.EntityClassII</entityClass>
and delete the scanAnnotatedClasses in your config file.
If you don't want to declare the solution and entity classes manually, including the packages containing the solution and entity classes also works as workaround:
<scanAnnotatedClasses>
<packageInclude>your.package.here</packageInclude>
</scanAnnotatedClasses>
Documentation about <packageInclude> can be found here

FAIL - Deployed application at context path / but context failed to start

Im working in 2 separate webapplications a back and front app.
The funny thing is when I run the back-end I don't have any issues. But in the front-end I get the following error:
I have the following error in Netbeans
NetBeans: Deploying on Apache Tomcat or TomEE
profile mode: false
debug mode: false
force redeploy: true
Undeploying ...
undeploy?path=/
OK - Undeployed application at context path /
In-place deployment at D:\WebDevel\WebStore\WebFrontE\target\Web-1.0-SNAPSHOT
Deployment is in progress...
deploy?config=file%3A%2FC%3A%2FUsers%7E1%2FAppData%2FLocal%2FTemp%2Fcontext7815575477480252472.xml&path=/
FAIL - Deployed application at context path / but context failed to start
Both are running on the same Tomcat. my colleague has the same code and it works fine :-s
Context Path (or) Context Root must be unique for each application deployed on the server.
So you can't deploy two applications with same context root to the same server. It seems for both of your applications the context path is /.
Check server.xml to see what context path both of them have. If they are not unique, then change them to solve the problem.
But if you want the same context root for both applications, then you need to deploy them in two different servers.
For more information:
Tomcat Context paths configuration
I may be a little late but would say that this could be because of the change in the factory name in Tomcat 8. So follow the below steps:
1) First, see if you are using Tomcat 8 or higher.
2) If yes, and tomcat is not able to deploy your application. Run the application in Debug mode and see stack trace in Tomcat window (at bottom. Not same as Tomcat.log). Scroll down the window and see if you can find an Exception like this:
Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory
3) If you see something like above, Open your META-INF/context.xml and replace or add the factory attribute in the resource tag with:
factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory"
4) Restart tomcat and redeploy.
While trying to deploy a spring boot web app from jenkins to an external VM I was getting the same error as below.
After I look into tomcat log I found it was for java version error. I didnt install proper java version which my spring boot application supports.
I installed openjdk 8 and removed java7 from vm and it was resolved.
The actual cause behind the below error can be many . so check your tomcat /logs/catalina.out directory for exact error. at Jenkins build log it doesn't give actual error.
FAIL - Deployed application at context path [/webapp] but context
https://www.youtube.com/watch?v=1jsKGhXmm4c
I had this problem a d after a lot of links that didn't work, found this solution. Edit the server.xml on your Tomee server to provide a fully qualified path for appBase:
<Host name="localhost" appBase="C:\apache\apache-tomee-7.0.2-plume\webapps"
unpackWARs="true" autoDeploy="true">
The following error occurs if your context has not started well.
Instance : You have context listener that calls a method and the method is not present.
My issue was a syntax error in web.xml, I didn't close an element
The tomcat window (NetBeans) had a clear errormessage, thanks Arafat
01-Sep-2018 17:34:38.641 SEVERE [http-nio-8080-exec-5] org.apache.tomcat.util.digester.Digester.fatalError Parse Fatal Error at line 50 column 11: The element type "param-value" must be terminated by the matching end-tag "".
I am also had trouble solving this kind of issue on my netbeans. I'm stack the whole day getting rid of this issue. Many solutions have been tried but still nothing happen until I tried to delete the "target" folder of my project and that solved the problem! Hope it helps! :)
I have came across this problems several times,i tried the below steps and it worked..!
1. Backup you current project(For safety).
2. Locate you project folder location (Normally found in MyDocuments or Documents folder named as NetBeansProjects).
3. Open the project folder and delete the folder named target inside your project folder
4. Close the NetBeans and re-open the it and run the project.
And you are good to go.
If the above didn't work then try deleting the xml file from the folder "Tomcat 9.0\conf\Catalina\localhost" folder.
I had this error while using Java Web due to a syntax error:
My Servlet code should be like this:
#WebServlet(name = "EleicaoServlet", urlPatterns = {"/EleicaoServlet", "/main", "/insert", "/edit", "/delete", "/update"})
But I forgot to type '/' in the "/update"
#WebServlet(name = "EleicaoServlet", urlPatterns = {"/EleicaoServlet", "/main", "/insert", "/edit", "/delete", "update"})
And I got this error.
So if nothing above works you may want to check your code, it can be something stupid like this.
I have tried
mvn clean install
and worked for me for the same problem :)
'undeployed application at context path' this error occur due to missing some file while copying project from one system to another.
while coping make sure all files should be copied.If an error occur then please recopy project and import it..
It may work..
I just had the same issue i solved by giving security permission to the user for Apache Server Foundation in root folder
in my case i removed some configuration tags that i added in web.xml,trying to configure a strut package.I also removed that package respectively,i restarted the server,run the project and it worked.
Faced the same problem # one time. In one of the instance, it was caused by a controller that had multiple methods with same route e.g
#RestController
public class UsersController
{
#Autowired
UsersInterface userInterface;
#RequestMapping(value = "/get", method = RequestMethod.GET)
public String test()
{
return "Users";
}
#RequestMapping(value = "/get", method = RequestMethod.GET)
public List<user> getUsers()
{
List<User> users = userInterface.getUsers();
return users;
}
}
As you can see, the controller has 2 methods that define two get routes, hence Spring cannot resolve the method to run the .../users/get route.
Remote one of the get routes and change it to something else.
I may be late to answer but might help others later in the future.
This could be many causes, but the most frequent personally in my case was the web.xml file servlet declarations. When I was cross developing a project both on Mac and Linux, I saw the file behave different in the two platforms due to some space or new line issues. It took me hours to find out as the servlet count was more than 20. Ultimately I narrowed down to strangely only one controller class declaration and found the syntax to be absolutely perfect. It bamboozled me, so I thought I'd rewrite the declaration after deleting the old one and BAM! It worked on Mac immediately. Strange.
I am facing this problem, after trying several other suggestions, the following thing worked perfectly for me.
Delete the following file:
/apache-tomcat-9.0.13/conf/Catalina/localhost/*.xml
This is a bit late but for anyone who might face the same error.
For me, this error was caused by wrong syntax in my servlet.
#WebServlet(urlPatterns = {"/x/login", "/x/register", "/x/logout", "x/createrestaurant"})
It looked like the above and I got the same error. After sometime and trying to deploy on a different server (from Tomcat to Glassfish), Glassfish gave me better logs and I realized the syntax should have been like this
#WebServlet(urlPatterns = {"/x/login", "/x/register", "/x/logout", "/x/createrestaurant"}).
Notice the / before x/createrestaurant.
I had the same issue with even newly added projects tried a lot of stuff mentioned above. what works for me is to manually Stop tomcat service in the Installation directory \Tomcat 9.0\bin Tomcat9w.exe. Then deployed the project it works this way in Netbeans IDE.
FAIL - Failed to deploy application at context path...
I was facing the same issue. But I resolved it. Please see the following steps:
First, stop the Tomcat service that is already running on the background, Not in the Netbeans. For this, go to TaskManager properties>Services>tomcat
Right click on the tomcat service to stop
Now, after that. Close netbeans IDE and run again
Right click on the project and select run. The project will be running without any issue
I hope above solution will be helpfull who having the same error.
One Problem could be the port you are trying to use might be being used by another application. Try changing the port or clearing that one and it might work fine.
Problem has been resolved by stopping the Tomcat server
sudo systemctl stop tomcat
so as to allow Netbeans to run it. If the server is already running when Netbeans tries to deploy an app Netbeans will display the delopy failed message.
I had the same problem, but I used only maven (without IDE). My tomcat version was tomcat7 7.0.70-1 and jdk8 (in pom.xml: <java.version>1.8</java.version>) It turned out that tomcat7 incompatible with java 8, so, I changed java.version in pom.xml on <java.version>1.7</java.version> and that was the solution!
I had same problem and I resolved this issue by stopping the tomcat from IDE and run the web application it starts the tomcat automatically.(This works in Netbeans IDE). Simply Stop Tomcat and start again and redeploy web application.

Hibernate in Servlet causesNoClassDefFoundError: org/slf4j/LoggerFactory

I have a Java (6) application which uses Hibernate (V3.3.2) to read data from HSQLDB, which i build and debug/run with Eclipse (V3.5.1), and it works fine.
I then created a GWT (V1.7) Servlet web app, copied my hibernate classes into it, and added the same User Libraries dependencies. However when i run the servlet and try to access a URL which invokes my code i get this:
java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
at org.hibernate.cfg.Configuration.<clinit>(Configuration.java:152)
at xxx.daoimpl.DAOSession.initialise(DAOSession.java:40)
where DAOSession.java:40 is :
AnnotationConfiguration config = new AnnotationConfiguration ();
Googling for this error suggests i am missing slf4j-api.jar from the classpath, however if i look at the command line for the Debug properties i can see this jar there:
C:\java\jsedk_6\jre\bin\javaw.exe
-agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:54541
-Xmx512m -Dfile.encoding=Cp1252
-classpath
D:\dev\workspace\xxx\src;
D:\dev\workspace\xxx\resources;
D:\dev\workspace\xxx\war\WEB-INF\classes;
C:\java\eclipse\plugins\com.google.gwt.eclipse.sdkbundle.win32_1.7.1.v200909221731\gwt-windows-1.7.1\gwt-user.jar;
C:\java\eclipse\plugins\com.google.gwt.eclipse.sdkbundle.win32_1.7.1.v200909221731\gwt-windows-1.7.1\gwt-dev-windows.jar;
C:\java\hibernate-annotations-3.4.0.GA\hibernate-annotations.jar;
C:\java\hibernate-annotations-3.4.0.GA\lib\ejb3-persistence.jar;
C:\java\hibernate-annotations-3.4.0.GA\lib\hibernate-commons-annotations.jar;
C:\java\hibernate-distribution-3.3.2.GA\hibernate3.jar;
C:\java\hibernate-distribution-3.3.2.GA\lib\required\antlr-2.7.6.jar;
C:\java\hibernate-distribution-3.3.2.GA\lib\required\commons-collections-3.1.jar;
C:\java\hibernate-distribution-3.3.2.GA\lib\required\dom4j-1.6.1.jar;
C:\java\hibernate-distribution-3.3.2.GA\lib\required\javassist-3.9.0.GA.jar;
C:\java\hibernate-distribution-3.3.2.GA\lib\required\jta-1.1.jar;
C:\java\hibernate-validator-4.0.1.GA\hibernate-validator-4.0.1.GA.jar;
C:\java\hibernate-validator-4.0.1.GA\lib\validation-api-1.0.0.GA.jar;
C:\java\hibernate-validator-4.0.1.GA\lib\log4j-1.2.14.jar;
C:\java\hsqldb\lib\hsqldb.jar;
C:\java\restlet-jse-2.0m5\lib\org.restlet.jar;
C:\java\restlet-jee-2.0m5\lib\org.restlet.ext.servlet.jar;
C:\java\restlet-jse-2.0m5\lib\org.restlet.ext.xml.jar;
C:\java\slf4j-1.5.8\slf4j-api-1.5.8.jar;
C:\java\slf4j-1.5.8\slf4j-log4j12-1.5.8.jar
com.google.gwt.dev.HostedMode
...
If i open the jar i can see the LoggerFactory class in there.
Any idea why it isn't being found by the class loader?
Edit 1: If try to access org.slf4j.LoggerFactory from my code, Eclipse compiles it ok, but i get the same error at runtime.
Edit 2: If i add a Test class with a main which calls the same code and run it, it works. So this classpath problem seems specific to the Servlet.
thanks,
jon
It seems that copying the two slf4j jars to the war/WEB-INF/lib sub-project/dir fixed the problem. I'm not really sure why i should need to do this for these two jars and not for all the other Hibernate, Restlet etc jars that the project also uses, though i suppose for consistency i will do that anyway - i guess it will make deployment easier as well.
If someone can provide some sort of explanation as to why this worked and why exactly i need to do it i will select it as the "correct" answer, otherwise i'll select this one.
Can you please reconfirm that you have at least two slf4j.jar files in the classpath, the slf4j-api.jar and exactly one implementation, such as slf4j-jdk14.jar?
You must not have multiple sflj4-implementations in the classpath.
You have a runtime dependency issue so everything compiles fine but the dependency is in your jars. You need to visit the Hibernate site and look at the compatibility matrix and make sure you are matched up correctly then check the dependencies for annotations and core. You log4J jars look fine so it's definitely some quirk.
If it works in Eclipse then logically it's definitely some diff between the 2 runtimes (eclipse and non-eclipse), if the matrix checks out fine then see if you can factor out the commonalities in the 2 then work out the differences -- your answer should be in there.
I had a similar issue except I was using Tomcat and the NoClassDefFound error was on the juli logger. I fixed it by removing the Tomcat dependencies from my classpath when running in hosted mode because hosted mode embeds a Tomcat server that was conflicting. So I would see what happens if you remove some or all of the restlet jars from your classpath to see if they conflict.

JUnit4 + Eclipse "An internal error occurred during Launching"

I'm trying to run JUnit4 test cases on Eclipse 3.4.2 but it's not even starting for me. I have the junit-4.7.jar in my build path and the test application.
Here is a simple example that illustrates my problem
package test;
import org.junit.Before;
import org.junit.Test;
public class UTest {
#Test
public void test() {
}
#Before
public void setUp() throws Exception {
}
}
This compiles fine
Then I do "Run JUnit Test case" from Eclipse and I get an error dialog with this message
"Launching UTest' has encountered a problem
An internal error occurred during: "Launching UTest".
java.lang.NullPointerException
What causes these NullPointerExceptions? What am I doing wrong?
What worked for me after trying everything:
Go to help
Install New Software
Work with: Juno
Programming languages (expand it)
Install Java Development Tools
Restart
It works :)
I was able to fix this just by deleting the workspace and the Eclipse directory and starting over.
This worked for me:
create another copy of the test class (CopyOfUTest.java)
run the copy to make sure it passes
go into Run > Run Configurations
under JUnit, find the run configurations for the original class and the copied class
right click and delete the configuration of the original class
rename the configuration of the copied class to the original configuration name
delete the copied class from the project
None of the given answers here worked for me, so I ended up just installing and using InfiniTest instead. It doesn't have this problem, and it also runs the tests automatically so I can focus on my work.
Have you looked in the Eclipse error log? You can see it by opening the "Error Log" view.
http://help.eclipse.org/help32/topic/org.eclipse.pde.doc.user/guide/tools/views/error_log.htm
This error In eclipse can be caused if you are also using the Android Development Kit plugins:
"Launching UTest' has encountered a problem
An internal error occurred during: "Launching UTest".
java.lang.NullPointerException
Can be caused if you are loading a normal Java project into an Eclipse instance with android ADT plugins installed and enabled. In this situation, Eclipse looks for "Android" project files, and doesn't find any. So it says: "NullPointerException".
So to fix it, re-download Eclipse without the ADT Plugin: https://www.eclipse.org/downloads/
Then re-import your project fresh. And the junit tests run without a problem.
Many people hate eclipse for it's enigmatic error messages. It's like we are back in the 1950's punch card world, where there are no error messages. The program just halts and undefined behavior occurs.
Thanks that solved my problem too.
The problem started when i removed an old simulator, and created a new one.
Fix: Like the OP says remove the workspace, make sure to keep the projects inside it :)
then import them back to eclipse
"Sound like a lot of work" ?
Took me less than half a minute !!!
If you are using Android and its associated plugins, then Android only supports JUnit 3.
I resolved the problem by selecting Test Runner as JUnit 3.
In my class, JUnit 4 is added in the build path->libraries.
Then to run the test file, go to: Run As -> Run Configurations then select the corresponding test.java file and select Test Runner accordingly(whether it is JUnit 3 or 4).
Your code works fine for me.
Eclipse
Version: 3.4.1
Build id: M20080911-1700
I right click on the .java file RunAs JUnit Test. This would indicate the problem is caused by an Eclipse configuration problem, not a code problem.
I encountered a similar problem but I am using Python. This is what I did to solve/avoid it:
Removed my .project file and the project from Eclipse.
Created the project again.
Everything was working.
The problem seemed to be in the .project file where there were some references to CDT Builder and were not there in the new .project file.

Categories

Resources