2
votes

reconditionnement a échoué: impossible de trouver la classe principale lors de la création d'une bibliothèque à l'aide de Spring-Boot-Starter-Parent version 2.1.2.

J'ai créé un exemple de serveur de ressources dans Spring Security avec une bibliothèque qui contient le WebSecurityConfigurerAdapter . Lorsque je mets à jour le parent spring-boot-starter-parent dans le pom de la bibliothèque de 2.0.8 à 2.1.2 ainsi que le code spring-boot-maven-plugin code > Je reçois le redoutable reconditionnement a échoué: impossible de trouver la classe principale La version 2.0.8 du spring-boot-starter-parent n'a pas ce problème.

Mise à jour: cela se produit lors d'une installation mvn clean compile. Une version du code avec le parent 2.0.8 peut être trouvée ici a>. Changez simplement le parent de démarrage de printemps pom.xml de 2.0.8 à 2.1.2.

Ma bibliothèque pom est la suivante.

package com.example.utils.security.resource.autoconfig;

import org.springframework.context.annotation.Configuration;
import org.springframework.core.PriorityOrdered;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
@Order(PriorityOrdered.HIGHEST_PRECEDENCE + 500)
public class ResourceServerConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .anonymous().disable()
                .logout().disable()
                .formLogin().disable()
                .httpBasic().disable()
                .authorizeRequests()
                .antMatchers(HttpMethod.OPTIONS).permitAll()
                .anyRequest().authenticated()
                .and()
                .oauth2ResourceServer().jwt();
    }
}

Une classe à définir une annotation.

import com.example.utils.security.resource.autoconfig.ResourceServerConfig;
import org.springframework.context.annotation.Import;

import java.lang.annotation.*;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({ResourceServerConfig.class})
public @interface EnableExampleResourceServer {
}

Le WebSecurityConfigurerAdapter

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example.utils.security</groupId>
  <artifactId>resource-config</artifactId>
  <version>1.0.1</version>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.2.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <version>2.1.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <version>2.1.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-config</artifactId>
      <version>5.1.3.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-oauth2-jose</artifactId>
      <version>5.1.3.RELEASE</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-oauth2-resource-server -->
    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-oauth2-resource-server</artifactId>
      <version>5.1.3.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-web</artifactId>
      <version>5.1.3.RELEASE</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <version>2.1.2.RELEASE</version>
        <executions>
          <execution>
            <goals>
              <goal>repackage</goal>
            </goals>
            <configuration>
              <skip>true</skip>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

</project>


3 commentaires

Avez-vous la méthode principale dans votre projet?


Quel objectif Maven exécutez-vous réellement? package mvn ? Ou mvn spring-boot: repackage ? Cela peut être utile pour reproduire le problème


J'exécute mvn clean compile install qui, je pensais, exécutait l'objectif du package.


3 Réponses :


3
votes

Il pourrait y avoir 2 possibilités -

  1. Aucune méthode main () dans le projet OU

  2. L'emplacement du répertoire source est incorrect. Vous devez utiliser la directive sourceSets pour résoudre ce problème. votre répertoire source doit ressembler à quelque chose comme src/main/java/your/package.


1 commentaires

Pourquoi auriez-vous besoin d'une méthode principale pour une bibliothèque? Je peux changer la version parent de démarrage en 2.0.8 et cela se construit. Quant au répertoire, il représente le modèle ci-dessus.



2
votes

Les notes de publication décrivent que l'objectif de reconditionnement a désormais un identifiant pour permettre de remplacer plus facilement l'exécution du reconditionnement .

La construction ci-dessus est un peu étrange. Si vous ne voulez pas que le reconditionnement ait lieu, pourquoi définissez-vous l'objectif? Ne définissez simplement pas l'objectif et le reconditionnement ne se produira pas car le parent ne propose une exécution par défaut que lorsque le plugin est explicitement défini.

Si vous avez besoin de le définir pour une raison différente, le lien ci-dessus explique ce que vous devez faire. Actuellement, vous redéfinissez une deuxième exécution de l'objectif de reconditionnement .


1 commentaires

Merci pour votre commentaire. Cela m'a aidé à réaliser que je ne comprenais pas l'objectif du reconditionnement et comment utiliser le spring-boot-maven-plugin . J'utilisais un ancien pom créé par quelqu'un d'autre. Je comprends maintenant que je dois utiliser la disposition du plugin sans aucune pour l'installer.



2
votes

J'ai résolu ce problème en utilisant maven-compiler-plugin au lieu de spring-boot-maven-plugin . Reste à savoir ce qui fait que spring-boot-maven-plugin est à l'origine de ce problème.

Détails du plugin Maven:

    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.6.1</version>
    <configuration>
    <source>1.8</source>
    <target>1.8</target>
    </configuration>
    </plugin>


1 commentaires

C'est ce qui m'a résolu. Je voulais juste un module qui a des classes sources sans créer de fichier jar exécutable, et c'est ce qui l'a fait pour moi.