I started to learn Spring Framework as my first ever app.I tried to get defined Beans count but i can't run it.
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class runDemo {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext();
System.out.println(context.getBeanDefinitionCount());
}
}
and my gradle file
buildscript {
ext {
springBootVersion = '1.5.6.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile('org.springframework.boot:spring-boot-starter')
testCompile('org.springframework.boot:spring-boot-starter-test')
}
and when i run this:
Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:123)
Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationContext ...
I have spring context and spring core in the External Libraries loaded.
EDIT:I upgraded to Intellij idea 2017.2 and it still give the same error
i replaced
compile('org.springframework.boot:spring-boot-starter')
with
compile('org.springframework.boot:spring-boot-starter-web')
Related
I'm migrating a small java 8 Spring-Boot 2.1.0 project to Java 17 with Spring-Boot 2.6.3
The project uses RabbitMQ and is basically a serializer-deserializer.
The problem I'm encountering is that I cannot run the application because it fails to initialize this bean:
#Autowired
private ConnectionFactory connectionFactory;
#Bean
public IntegrationFlow fromDocToLDocFlow(AmqpTemplate amqpTemplate) {
return IntegrationFlows
.from(DOCUMENT_ROUTE)
.handle(Amqp.outboundAdapter(amqpTemplate).routingKey(documentBinding).exchangeName(documentExchange))
.get();
}
And the exception I get is this:
Error creating bean with name 'fromDocToLDocFlow.amqp:outbound-channel-adapter#0' defined in class path resource [publisher/config/IntegrationFlowConfiguration.class]: Invocation of init method failed;
nested exception is java.lang.IncompatibleClassChangeError: Expecting non-static method 'java.lang.Object org.springframework.integration.context.IntegrationObjectSupport.extractTypeIfPossible(java.lang.Object, java.lang.Class)'... 14 common frames omitted
Caused by: java.lang.IncompatibleClassChangeError: Expecting non-static method 'java.lang.Object org.springframework.integration.context.IntegrationObjectSupport.extractTypeIfPossible(java.lang.Object, java.lang.Class)'
at org.springframework.integration.amqp.outbound.AbstractAmqpOutboundEndpoint.doInit(AbstractAmqpOutboundEndpoint.java:409) ~[spring-integration-amqp-5.1.0.RELEASE.jar:5.1.0.RELEASE]
... 26 common frames omitted
Here is my gradle configuration:
buildscript {
ext {
springBootVersion = '2.6.3'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
group = 'com.group'
sourceCompatibility = 17
repositories {
mavenCentral()
mavenLocal()
}
dependencies {
implementation('org.springframework.boot:spring-boot-starter-amqp')
implementation('org.springframework.boot:spring-boot-starter-integration')
implementation("org.springframework.integration:spring-integration-feed:5.1.0.RELEASE")
implementation("org.springframework.integration:spring-integration-amqp:5.1.0.RELEASE")
implementation("com.fasterxml.jackson.core:jackson-databind:2.13.1")
implementation("org.apache.commons:commons-lang3:3.12.0")
compileOnly 'org.projectlombok:lombok:1.18.22'
annotationProcessor 'org.projectlombok:lombok:1.18.22'
testImplementation("junit:junit")
testImplementation('org.springframework.boot:spring-boot-starter-test')
testImplementation('commons-io:commons-io:2.11.0')
}
Compiled dependencies:
Gradle: org.springframework.amqp:spring-rabbit:2.4.22
Gradle: org.springframework.amqp:spring-amqp:2.4.22
Gradle: org.springframework.boot:spring-boot:2.6.32
Gradle: org.springframework.retry:spring-retry:1.3.1
What I'm trying to do is to extract all of spring-boot-starters to a separate app, pack all of it into a single JAR (using gradle shadow plugin) and then deploy it to local nexus artifacts repository, so I can import it and all of its dependencies to my spring boot application.
Here is build.gradle of app that contains spring-boot-starters:
buildscript {
ext {
springBootVersion = '2.1.0.RELEASE'
}
repositories {
mavenCentral()
jcenter()
maven {
url "http://localhost:8081/repository/testowe/"
credentials {
username 'admin'
password 'admin123'
}
}
}
dependencies {
classpath 'com.github.jengelman.gradle.plugins:shadow:4.0.4'
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
subprojects {
apply plugin: 'java-library'
apply plugin: 'idea'
apply plugin: 'java'
apply plugin: 'com.github.johnrengelman.shadow'
apply plugin: 'maven-publish'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'org.springframework.boot'
version = '1.0'
sourceCompatibility = 1.11
jar { enabled = true }
shadowJar { classifier(null) }
repositories {
jcenter()
mavenCentral()
maven {
url "http://localhost:8081/repository/testowe/"
credentials {
username 'admin'
password 'admin123'
}
}
}
publishing {
publications {
shadow(MavenPublication) { publication ->
project.shadow.component(publication)
}
}
repositories {
maven {
url "http://localhost:8081/repository/testowe/"
credentials {
username 'admin'
password 'admin123'
}
}
}
}
dependencies {
compile('org.springframework.boot:spring-boot-starter-web') {
transitive = true
}
compile('org.springframework.boot:spring-boot-starter-actuator') {
transitive = true
}
compile('org.springframework.boot:spring-boot-starter-data-jpa') {
transitive = true
}
compile('org.springframework.boot:spring-boot-starter-security') {
transitive = true
}
compile('org.springframework.boot:spring-boot-starter-test') {
transitive = true
}
}
}
Here is build.gradle of spring-boot app that I want to run with all spring-boot-starter dependencies coming from built JAR:
buildscript {
ext {
springBootVersion = '2.1.0.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
sourceCompatibility = 11
repositories {
mavenCentral()
maven {
url "http://localhost:8081/repository/testowe/"
credentials {
username 'admin'
password 'admin123'
}
}
}
dependencies {
// When I'm running app with starters placed here everything works fine
// implementation('org.springframework.boot:spring-boot-starter-data-jpa')
// implementation('org.springframework.boot:spring-boot-starter-security')
// implementation('org.springframework.boot:spring-boot-starter-test')
// implementation('org.springframework.boot:spring-boot-starter-web')
// When I'm trying to run it with my JAR it doesn't work
implementation("pl.mplan:web-common:1.0")
compile group: 'org.javassist', name: 'javassist', version: '3.23.2-GA'
compile group: 'io.jsonwebtoken', name: 'jjwt', version: '0.9.1'
runtimeOnly('org.postgresql:postgresql')
compileOnly('org.projectlombok:lombok')
testImplementation('org.springframework.boot:spring-boot-starter-test')
compile("com.querydsl:querydsl-core:4.2.1")
compile("com.querydsl:querydsl-jpa:4.2.1")
compile("com.querydsl:querydsl-apt:4.2.1:jpa")
}
compileJava {
options.annotationProcessorGeneratedSourcesDirectory = file("$projectDir/generated/java")
}
idea {
module {
sourceDirs += file("$projectDir/generated/java")
}
}
When I'm trying to run app with gradle bootRun task here's what I get:
17:55:32.169 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Retrieved dependent beans for bean 'objectPostProcessor': [org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration]
17:55:32.169 [main] DEBUG org.springframework.beans.factory.support.DisposableBeanAdapter - Invoking destroy() on bean with name 'objectPostProcessor'
17:55:32.175 [main] ERROR org.springframework.boot.SpringApplication - Application run failed
org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.context.ApplicationContextException: Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:155)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:386)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:307)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1242)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1230)
at pl.mplan.brew.it.BrewItBackendApplication.main(BrewItBackendApplication.java:12)
Caused by: org.springframework.context.ApplicationContextException: Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.getWebServerFactory(ServletWebServerApplicationContext.java:204)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:178)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:152)
... 8 common frames omitted
(I'm using gradle 4.8 and shadow plugin 4.0.4)
Any ideas how to fix it? Thanks in advance!
I'm trying to deploy Spring Boot war file to jboss 7. I don't use MongoDB anywhere, but somehow I'm getting NoClassDefFoundError error for MongoClientOptions:
16:15:04,876 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-3) MSC00001: Failed to start service jboss.deployment.unit."myapp-0.1.0.war".INSTALL: org.jboss.msc.service.StartException in service jboss.deployment.unit."myapp-0.1.0.war".INSTALL: Failed to process phase INSTALL of deployment "myapp-0.1.0.war"
at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:121)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1765)
at org.jboss.msc.service.ServiceControllerImpl$ClearTCCLTask.run(ServiceControllerImpl.java:2291)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [:1.8.0_112]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [:1.8.0_112]
at java.lang.Thread.run(Thread.java:745) [:1.8.0_112]
Caused by: java.lang.RuntimeException: Error getting reflective information for class org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration
at org.jboss.as.server.deployment.reflect.DeploymentReflectionIndex.getClassIndex(DeploymentReflectionIndex.java:70)
at org.jboss.as.ee.component.EEModuleClassDescription$DefaultConfigurator.configure(EEModuleClassDescription.java:144)
at org.jboss.as.ee.component.EEClassConfigurationProcessor.deploy(EEClassConfigurationProcessor.java:100)
at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:115)
... 5 more
Caused by: java.lang.NoClassDefFoundError: Lcom/mongodb/MongoClientOptions;
at java.lang.Class.getDeclaredFields0(Native Method) [:1.8.0_112]
at java.lang.Class.privateGetDeclaredFields(Class.java:2583) [:1.8.0_112]
at java.lang.Class.getDeclaredFields(Class.java:1916) [:1.8.0_112]
at org.jboss.as.server.deployment.reflect.ClassReflectionIndex.<init>(ClassReflectionIndex.java:57)
at org.jboss.as.server.deployment.reflect.DeploymentReflectionIndex.getClassIndex(DeploymentReflectionIndex.java:66)
... 8 more
Caused by: java.lang.ClassNotFoundException: com.mongodb.MongoClientOptions from [Module "deployment.myapp-0.1.0.war:main" from Service Module Loader]
... 13 more
My guess - Spring Boot includes it automatically. I've tried to exclude it like this:
#EnableAutoConfiguration(exclude=MongoAutoConfiguration.class)
public class Application extends SpringBootServletInitializer {
#Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
But it has no effect.
My build.gradle:
buildscript {
repositories {
jcenter()
mavenCentral()
maven { url "http://repo.spring.io/snapshot" }
maven { url "http://repo.spring.io/milestone" }
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.7.RELEASE")
}
}
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'application'
apply plugin: 'war'
sourceCompatibility = 1.6
targetCompatibility = 1.6
repositories {
jcenter()
mavenCentral()
maven { url "http://repo.spring.io/snapshot" }
maven { url "http://repo.spring.io/milestone" }
}
dependencies {
compile "org.springframework.boot:spring-boot-starter-web:1.5.7.RELEASE"
providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")
}
war {
baseName = 'myapp'
version = '0.1.0'
}
I'm trying to write a junit test for my first java project using Spring framework. I have searched online how to include the dependency in order to use it but keep encountering this warning:
Cannot resolve symbol 'SpringRunner'
in intelliJ IDEA. So what is missing?
Here is my dependency file for gradle.
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle- plugin:1.5.1.RELEASE")
classpath("org.springframework:spring-test:4.0.3.RELEASE")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
repositories {
mavenCentral()
}
sourceCompatibility = 1.8
targetCompatibility = 1.8
dependencies {
testCompile("org.springframework:spring-test:4.0.3.RELEASE")
compile('com.google.maps:google-maps-services:0.1.18')
compile("org.springframework.boot:spring-boot-starter-thymeleaf")
compile("org.springframework.boot:spring-boot-starter-security")
compile("org.springframework.boot:spring-boot-starter-data-mongodb")
compile("org.springframework.boot:spring-boot-starter-web")
testCompile('junit:junit:4.12')
testCompile('org.springframework.boot:spring-boot-starter-test')
testCompile("org.springframework.security:spring-security-test")
}
try adding org.springframework.test.context.junit4.SpringRunner;
I'm using the Spring Boot gradle plugin to build an executable war. I have a FindResource.java class in src/main/resources to locate files:
FindResource.class.getResource(templateName).toURI()
When I execute gradle build I get an error, that the class FindResource cannot be resolved. Do I need to the the Spring Boot gradle plugin, that it should also use classes from the resources directory. How can I do so?
My build.gradle looks as follows:
buildscript {
ext {
springBootVersion = '1.2.5.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
classpath("io.spring.gradle:dependency-management-plugin:0.5.2.RELEASE")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'spring-boot'
apply plugin: 'io.spring.dependency-management'
jar {
baseName = 'abc'
version = '0.0.1-SNAPSHOT'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile("org.springframework.boot:spring-boot-starter-data-jpa")
compile("org.springframework.boot:spring-boot-starter-jersey")
compile("org.springframework.boot:spring-boot-starter-web")
compile("org.apache.pdfbox:pdfbox:1.8.10")
compile('org.apache.poi:poi-ooxml:3.12')
compile('org.apache.poi:poi-scratchpad:3.12')
runtime("org.hsqldb:hsqldb")
testCompile("org.springframework.boot:spring-boot-starter-test")
}
task wrapper(type: Wrapper) {
gradleVersion = '2.3'
}
As mentioned in the comment class files to load need to be in src/main/java/ and not in src/main/resources. This link may help give you more information on the convention of this structure.