Author Archives: Gustavo Amaro
Java 11 + Maven + Spring Boot – Erro: Repackage failed: Unable to load the mojo ‘repackage’ in the plugin spring-boot-maven-plugin due to an API incompatibility
Depois de muito tempo sem postar, venho novamente trazer uma solução de um problema que me levou algumas boas horas pesquisando pra identificar o problema.
Trabalhando em um projeto maven com spring boot gerado a partir do THOR, o projeto compilava corretamente local, porém através do pipeline do GitLab tomávamos o seguinte erro:
[WARNING] Error injecting: org.springframework.boot.maven.RepackageMojo
java.lang.TypeNotPresentException: Type org.springframework.boot.maven.RepackageMojo not present
at org.eclipse.sisu.space.URLClassSpace.loadClass (URLClassSpace.java:147)
at org.eclipse.sisu.space.NamedClass.load (NamedClass.java:46)
at org.eclipse.sisu.space.AbstractDeferredClass.get (AbstractDeferredClass.java:48)
at com.google.inject.internal.ProviderInternalFactory.provision (ProviderInternalFactory.java:85)
at com.google.inject.internal.InternalFactoryToInitializableAdapter.provision (InternalFactoryToInitializableAdapter.java:57)
...
at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
Caused by: java.lang.UnsupportedClassVersionError: org/springframework/boot/maven/RepackageMojo has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0
at java.lang.ClassLoader.defineClass1 (Native Method)
at java.lang.ClassLoader.defineClass (ClassLoader.java:1017)
at java.security.SecureClassLoader.defineClass (SecureClassLoader.java:174)
at java.net.URLClassLoader.defineClass (URLClassLoader.java:550)
at java.net.URLClassLoader$1.run (URLClassLoader.java:458)
at java.net.URLClassLoader$1.run (URLClassLoader.java:452)
at java.security.AccessController.doPrivileged (Native Method)
at java.net.URLClassLoader.findClass (URLClassLoader.java:451)
at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClassFromSelf (ClassRealm.java:425)
at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass (SelfFirstStrategy.java:42)
at org.codehaus.plexus.classworlds.realm.ClassRealm.unsynchronizedLoadClass (ClassRealm.java:271)
...
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
...
[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:3.0.0-M1:repackage (default) on project cpb-ms-core-application: Execution default of goal org.springframework.boot:spring-boot-maven-plugin:3.0.0-M1:repackage failed: Unable to load the mojo 'repackage' in the plugin 'org.springframework.boot:spring-boot-maven-plugin:3.0.0-M1' due to an API incompatibility: org.codehaus.plexus.component.repository.exception.ComponentLookupException: org/springframework/boot/maven/RepackageMojo has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0
Analisando o pom do projeto identifiquei que a versão do spring-boot-maven-plugin não foi definida:
...
<profiles>
<profile>
<id>default</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
...
De alguma maneira durante a compilação ele estava pegando a versão 3.0.0-M1, que pela pesquisa que fiz, parece só ser possível compilar no java 17.
Para resolver esse problema foi necessário apenas definir explicitamente a versão que deveria ser utilizada para esse plugin:
...
<profiles>
<profile>
<id>default</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.6.4</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
...
Simples assim, espero que tenha ajudado 😀 See ya!
Solução: java.lang.ClassNotFoundException: javax.xml.bind.JAXBException
E ai galera beleza, estava estudando um projeto Spring MVC com Hibernate que será colocado na AWS, porém estava apanhando pra subir o projeto no TomCat, estava tomando esse erro:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class br.com.casadocodigo.loja.configuration.JPAConfiguration: Invocation of init method failed; nested exception is org.hibernate.cfg.beanvalidation.IntegrationException: Error activating Bean Validation integration
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1568)
...
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:399)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:842)
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:341)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1627)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1564)
... 21 more
Caused by: java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
at org.hibernate.validator.engine.ConfigurationImpl.parseValidationXml(ConfigurationImpl.java:252)
at org.hibernate.validator.engine.ConfigurationImpl.buildValidatorFactory(ConfigurationImpl.java:143)
...
at java.base/java.lang.reflect.Method.invoke(Method.java:567)
at org.hibernate.cfg.beanvalidation.BeanValidationIntegrator.integrate(BeanValidationIntegrator.java:150)
... 32 more
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.JAXBException
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1339)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1167)
... 42 more
Depois de tentar com TomCat 7, 8 e 8.5 descobri que as APIs do JAXB foram consideradas APIs do Java EE então não estão mais no classpath default do Java SE 9. Já no Java 11, elas foram completamente removidas do JDK. E eu estou com o JDK 12 na minha máquina… tsc tsc tsc…
Resolvi esse problema adicionando as seguintes dependências no pom.xml do maven:
<!-- API, java.xml.bind module -->
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>2.3.2</version>
</dependency>
<!-- Runtime, com.sun.xml.bind module -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.2</version>
</dependency>
Simples, assim… é isso ai galera, lição aprendida! Abraços!
Fonte: Andy Guibert – Stackoverflow
Apostila – Introdução ao Java 7
Boa noite galera,
Segue a apostila que eu montei e utilizo no curso de introdução ao java 7 lecionado para os estagiários da empresa em que trabalho:
Introdução ao Java 7 – v1.2
Abraços!
SQL – UPDATE a partir de um SELECT
E ai galera, beleza?
Hoje vamos aprender como efetuar UPDATE em registros obtidos a partir de um SELECT, temos duas formas e fazê-lo, para exemplificar vamos considerar o seguinte SELECT:
SELECT A.* FROM TAB_A A JOIN TAB_B B ON (A.ID = B.ID) WHERE <CONDIÇÕES...>
Opção 1 – Utilizar o SELECT desejado no lugar da tabela a ser alterada, no SET utilize as colunas da TAB_A que serão atualizadas:
UPDATE ( SELECT A.* FROM TAB_A A JOIN TAB_B B ON (A.ID = B.ID) WHERE <CONDIÇÕES...> ) SET <COL1 TAB_A> = <VAL1>, <COL2 TAB_A> = <VAL2>
A abordagem acima em algumas modelagem podem acarretar no erro ORA-01779: cannot modify a column which maps to a non key-preserved table, quando isso acontecer utilize a opção 2, abaixo.
Opção 2 – Utilizar a clausula EXISTS no WHERE do UPDATE tradicional:
UPDATE TAB_A TA SET <COL1 TAB_A> = <VAL1>, <COL2 TAB_A> = <VAL2> WHERE EXISTS ( SELECT A.* FROM TAB_A A JOIN TAB_B B ON (A.ID = B.ID) WHERE <CONDIÇÕES...> AND A.ID = TA.ID )
Espero que tenha ajudado! Qualquer dúvida, poste aqui nos comentários que eu responderei o mais breve possível 😉
See ya!
MongoDB – Erro: Can’t extract geo keys
E ai galera, estou me aventurando no mundo NoSQL com o sr. MongoDB…
E ao criar meu primeiro índice para fazer pesquisas por proximidade, tomei meu primeiro erro, e tive que ir atrás para resolve-lo 😦
Oque aconteceu, peguei latitudes e longitudades pelo google maps, lá pros lados da austrália…
type: "Point", coordinates: [ -33.91991, 151.257018 ]
adicionei ao meu documento e tentei gerar o índice e tomei o erro abaixo:
db.xxx.createIndex({ xxx : "2dsphere"})
…
“ok” : 0,
“errmsg” : “Can’t extract geo keys… longitude/latitude is out of bounds, lng: … lat: …”,
“code” : 16755,
“codeName” : “Location16755”
Dando uma pesquisada, descobri é que o google maps disponibiliza os valores na ordem diferente (latitude/longitude) da qual o MongoDB espera (longitude/latitude)… para resolver o problema apenas precisei inverter os valores inseridos e o índice foi criado sem problemas 😀
Os valores da Longitude deve estar entre -180° e +180° e a Latitude entre -90° e 90°!!! (Y)
Espero que tenha ajudado!
Erro: web.xml is missing and is set to true
E ai galera, beleza?
Está tomando o erro “web.xml is missing and <failOnMissingWebXml> is set to true” no seu projeto maven dentro do eclipse???
Então vamos corrigir esse erro!
- Clique com o botão direito no ‘Deployment Descriptor’ dentro do seu projeto no ‘Project Explorer’.
- Selecione a opção ‘Generate Deployment Descriptor Stub’.
- Pronto !!! 😀
Isso irá gerar a pasta ‘WEB-INF’ no src/main/webapp com o web.xml dentro.
Abraços!!!