2016-08-26 1 views
0

Pourquoi ma commande mvn clean install me dit-elle qu'elle ne peut pas trouver Symbol, alors que la classe dont elle se plaint semble clairement disponible?Maven lance une erreur de compilation, "Can not find symbol" sur @XmlAccessorType, mais je peux le trouver

Je construis une bibliothèque qui gère les appels vers une API REST (HP ALM). Il retourne xml, et donc je dois analyser les résultats.

La bibliothèque est à peu près terminée et fonctionne, mais maintenant je veux la tester dans une plus grande application graphique, et j'ai donc besoin de construire et d'installer le fichier .jar dans mon dépôt maven local. Il n'y a pas eu d'erreurs (pertinentes) lors du développement de la bibliothèque.

Voici l'erreur que je reçois lors de l'exécution mvn clean install

[INFO] Scanning for projects... 
[INFO] 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building rest-qc 1.0 
[INFO] ------------------------------------------------------------------------ 
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ rest-qc --- 
[INFO] Deleting C:\Data\workspaces\MRPB\workspace\rest-qc\target 
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ rest-qc --- 
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent! 
[INFO] Copying 0 resource 
[INFO] 
[INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ rest-qc --- 
[WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. build is platform dependent! 
[INFO] Compiling 27 source files to C:\Data\workspaces\MRPB\workspace\rest-qc\target\classes 
[INFO] ------------------------------------------------------------- 
[ERROR] COMPILATION ERROR : 
[INFO] ------------------------------------------------------------- 
[ERROR] \Data\workspaces\MRPB\workspace\rest-qc\src\main\java\infrastructure\Entity.java:[172,2] error: cannot find symbol 
[ERROR] \Data\workspaces\MRPB\workspace\rest-qc\src\main\java\infrastructure\Entity.java:[173,2] error: cannot find symbol 
[INFO] 2 errors 
[INFO] ------------------------------------------------------------- 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD FAILURE 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 1.400 s 
[INFO] Finished at: 2016-08-26T10:32:32+02:00 
[INFO] Final Memory: 10M/123M 
[INFO] ------------------------------------------------------------------------ 
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project rest-qc: Compilation failure: Compilati 
on failure: 
[ERROR] \Data\workspaces\MRPB\workspace\rest-qc\src\main\java\infrastructure\Entity.java:[172,2] error: cannot find symbol 
[ERROR] \Data\workspaces\MRPB\workspace\rest-qc\src\main\java\infrastructure\Entity.java:[173,2] error: cannot find symbol 
[ERROR] -> [Help 1] 
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. 
[ERROR] Re-run Maven using the -X switch to enable full debug logging. 
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles: 
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException 

Maintenant, j'ai lu qu'il pourrait y avoir un bug avec le plug-in du compilateur 2.3.2, donc je l'ai essayé plusieurs autres versions du plug-in . Voici la réponse de 3.1:

Ils donnent tous les deux presque la même erreur. 3.1 a les mêmes numéros de ligne que 2.3.2, mais l'index des caractères varie de 2-> 10. En outre, 3.1 indique spécifiquement quelles classes provoquent l'erreur. La classe Entity est une classe standard générée pour interpréter les résultats des appels REST. Tous les objets de résultats seront au format Entity.

Pour référence, voici mon fichier pom.xml. J'ai vérifié manuellement le jar de dépendance jaxb-bind pour vérifier si la classe d'annotation relevand est dans la bibliothèque. Et c'est.

<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>sdc.qualitycenter</groupId> 
    <artifactId>rest-qc</artifactId> 
    <version>1.0</version> 
    <dependencies> 
     <dependency> 
      <groupId>com.sun.jersey</groupId> 
      <artifactId>jersey-bundle</artifactId> 
      <version>1.19.1</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.xml.bind</groupId> 
      <artifactId>jaxb-api</artifactId> 
      <version>2.1</version> 
     </dependency> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>3.8.1</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>com.google.code.gson</groupId> 
      <artifactId>gson</artifactId> 
      <version>2.2.4</version> 
     </dependency> 
     <dependency> 
      <groupId>joda-time</groupId> 
      <artifactId>joda-time</artifactId> 
      <version>2.9.4</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.commons</groupId> 
      <artifactId>commons-lang3</artifactId> 
      <version>3.4</version> 
     </dependency> 
    </dependencies> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>2.3.2</version> 
       <configuration> 
        <source>1.7</source> 
        <target>1.7</target> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

Last but not least, l'entité classe (je manuellement ajouté une toString méthode)

package infrastructure; 

/* 

This file was generated by the JavaTM Architecture for XML Binding(JAXB) 
Reference Implementation, vhudson-jaxb-ri-2.1-456 
See http://www.oracle.com/technetwork/articles/javase/index-140168.html 
Any modifications to this file will be lost upon recompilation of the source schema. 


This example of an automatically generated class is an example of how one can 
generate classes from XSDs via xjc to match jaxb standards. 
XSD is a format for describing a class structure 
(note: the CLASS not an INSTANCE of the class). 
From an XSD one can generate a class java source file. 
When compiling this source file, one can "marshal" an actual object instance 
from the XML describing the object (this time we are talking about an instance, 
not a class). 

this process has many advantages, and is a form of serialization that is not 
language dependent. 
This is the recommended way of working with entities, though we do suggest you 
customize your entity class with simpler accessors. 


*/ 

import infrastructure.Entity.Fields.Field; 

import javax.xml.bind.annotation.*; 

import java.util.ArrayList; 
import java.util.List; 

/** 
* Java class for anonymous complex type. 
* 
* The following schema fragment specifies the expected content contained within this class. 
* 
* <complexType> 
* <complexContent> 
*  <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> 
*  <sequence> 
*   <element name="Fields"> 
*   <complexType> 
*    <complexContent> 
*    <restriction base= 
*     "{http://www.w3.org/2001/XMLSchema}anyType"> 
*     <sequence> 
*     <element name="Field" maxOccurs="unbounded"> 
*      <complexType> 
*      <complexContent> 
*       <restriction base= 
*       "{http://www.w3.org/2001/XMLSchema}anyType"> 
*       <sequence> 
*        <element name="Value" 
*        type="{http://www.w3.org/2001/XMLSchema}string" 
*        maxOccurs="unbounded"/> 
*       </sequence> 
*       <attribute name="Name" use="required" 
*        type="{http://www.w3.org/2001/XMLSchema}string" /> 
*       </restriction> 
*      </complexContent> 
*      </complexType> 
*     </element> 
*     </sequence> 
*    </restriction> 
*    </complexContent> 
*   </complexType> 
*   </element> 
*  </sequence> 
*  <attribute name="Type" use="required" 
*   type="{http://www.w3.org/2001/XMLSchema}string" /> 
*  </restriction> 
* </complexContent> 
* </complexType> 
* 
* 
*/ 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { "fields" }) 
@XmlRootElement(name = "Entity") 
public class Entity { 

    @XmlElement(name = "Fields", required = true) 
    protected Entity.Fields fields; 
    @XmlAttribute(name = "Type", required = true) 
    protected String type; 


    public Entity(Entity entity) { 
     type = entity.getType(); 
     fields = new Entity.Fields(entity.getFields()); 
    } 

    public Entity() {} 

    /** 
    * Gets the value of the fields property. 
    * 
    * @return possible object is {@link Entity.Fields } 
    * 
    */ 
    public Entity.Fields getFields() { 
     return fields; 
    } 

    /** 
    * Sets the value of the fields property. 
    * 
    * @param value 
    *   allowed object is {@link Entity.Fields } 
    * 
    */ 
    public void setFields(Entity.Fields value) { 
     this.fields = value; 
    } 

    /** 
    * Gets the value of the type property. 
    * 
    * @return possible object is {@link String } 
    * 
    */ 
    public String getType() { 
     return type; 
    } 

    /** 
    * Sets the value of the type property. 
    * 
    * @param value 
    *   allowed object is {@link String } 
    * 
    */ 
    public void setType(String value) { 
     this.type = value; 
    } 

    /** 
    * Java class for anonymous complex type. 
    * 
    * The following schema fragment specifies the expected content contained within this class. 
    * 
    * <complexType> 
    * <complexContent> 
    *  <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> 
    *  <sequence> 
    *   <element name="Field" maxOccurs="unbounded"> 
    *   <complexType> 
    *    <complexContent> 
    *    <restriction base= 
    *     "{http://www.w3.org/2001/XMLSchema}anyType"> 
    *     <sequence> 
    *     <element name="Value" 
    *      type="{http://www.w3.org/2001/XMLSchema}string" 
    *      maxOccurs="unbounded"/> 
    *     </sequence> 
    *     <attribute name="Name" use="required" 
    *     type="{http://www.w3.org/2001/XMLSchema}string" /> 
    *    </restriction> 
    *    </complexContent> 
    *   </complexType> 
    *   </element> 
    *  </sequence> 
    *  </restriction> 
    * </complexContent> 
    * </complexType> 
    * 
    * 
    */ 
    @XmlAccessorType(XmlAccessType.FIELD) 
    @XmlType(name = "", propOrder = { "field" }) 
    public static class Fields { 

     @XmlElement(name = "Field", required = true) 
     protected List<Field> field; 


     public Fields(Fields fields) { 
      field = new ArrayList<Field>(fields.getField()); 
     } 


     public Fields() {} 

     /** 
     * Gets the value of the field property. 
     * 

     * This accessor method returns a reference to the live list, not a snapshot. 
     * Therefore any modification you make to the returned list will be present 
     * inside the JAXB object. 
     * This is why there is no set method for the field property. 
     * 
     * For example, to add a new item, do as follows: 
     * 
     * getField().add(newItem); 
     * 
     * Objects of the following type(s) are allowed in the list {@link Entity.Fields.Field } 
     * 
     * 
     */ 
     public List<Field> getField() { 
      if (field == null) { 
       field = new ArrayList<Field>(); 
      } 
      return this.field; 
     } 

     /** 
     * Java class for anonymous complex type. 
     * 
     * The following schema fragment specifies the expected content contained 
     * within this class. 
     * 
     * <complexType> 
     * <complexContent> 
     *  <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> 
     *  <sequence> 
     *   <element name="Value" 
     *   type="{http://www.w3.org/2001/XMLSchema}string" 
     *   maxOccurs="unbounded"/> 
     *  </sequence> 
     *  <attribute name="Name" use="required" 
     *   type="{http://www.w3.org/2001/XMLSchema}string" /> 
     *  </restriction> 
     * </complexContent> 
     * </complexType> 
     * 
     */ 
     @XmlAccessorType(XmlAccessType.FIELD) 
     @XmlType(name = "", propOrder = { "value" }) 
     public static class Field { 

      @XmlElement(name = "Value", required = true) 
      protected List<String> value; 
      @XmlAttribute(name = "Name", required = true) 
      protected String name; 

      /** 
      * Gets the value of the value property. 
      * 
      * This accessor method returns a reference to the live list, not a snapshot. 
      * Therefore, any modification you make to the returned list will be present 
      * inside the JAXB object. This is why there is no set method 
      * for the value property. 
      * 
      * For example, to add a new item, do as follows: 
      * 
      * getValue().add(newItem); 
      * 

      * Objects of the following type(s) are allowed in the list {@link String } 
      * 
      * 
      */ 
      public List<String> getValue() { 
       if (value == null) { 
        value = new ArrayList<String>(); 
       } 
       return this.value; 
      } 

      /** 
      * Gets the value of the name property. 
      * 
      * @return possible object is {@link String } 
      * 
      */ 
      public String getName() { 
       return name; 
      } 

      /** 
      * Sets the value of the name property. 
      * 
      * @param value 
      *   allowed object is {@link String } 
      * 
      */ 
      public void setName(String value) { 
       this.name = value; 
      } 

     } 

    } 

    public String toString(){ 
     StringBuilder sb = new StringBuilder(); 
     sb.append("############## NEW ENTITY ################\n"); 
     List<Field> fields = this.getFields().getField(); 
     for (Field field : fields) { 
      sb.append(field.getName() + " : " + field.getValue()+"\n"); 
     } 
     return sb.toString(); 
    } 
} 
+0

Avez-vous essayé d'ajouter cette importation spécifiquement? import javax.xml.bind.annotation.XmlAccessorType; –

+0

Je n'avais pas. J'ai maintenant. Pas de changement du tout. – KjetilNordin

Répondre

-1

Je suppose que votre version que vous avez défini comme la dépendance

<dependency> 
    <groupId>javax.xml.bind</groupId> 
    <artifactId>jaxb-api</artifactId> 
    <version>2.1</version> 
</dependency> 

est trop vieux. Je suggère donc d'utiliser un newer version like

<dependency> 
    <groupId>javax.xml.bind</groupId> 
    <artifactId>jaxb-api</artifactId> 
    <version>2.2.12</version> 
</dependency> 
+0

Non. Déjà essayé ça aussi. Pas de changement dans l'erreur. – KjetilNordin

+0

Pourquoi ne pas l'avoir écrit dans votre question? – khmarbaise

+0

J'ai expérimenté cette configuration depuis longtemps. Je n'ai pas écrit toutes les choses que j'ai faites, donc je ne me souviens pas de toutes les choses par cœur. Aussi, j'essaie de garder la question aussi précise, mais aussi propre que possible. J'apprécie votre tentative d'aider si. – KjetilNordin

-1

J'ai eu exactement le même problème. La solution consistait à changer l'ordre des instructions d'importation. Dans votre cas, mettez cette déclaration d'importation en dernier et reconstruisez.

import infrastructure.Entity.Fields.Field;

+0

L'ordre des instructions 'import' individuelles en Java n'a pas d'importance – avojak

+0

C'était ma pensée, mais changer l'ordre des importations a résolu le problème pour moi. J'ai parlé avec d'autres développeurs de mon entreprise et personne n'a une bonne explication sur la raison pour laquelle le changement de l'ordre le corrige, mais c'est le cas. La seule raison pour laquelle je suis tombé sur cette solution était qu'il y avait d'autres classes dans le même projet utilisant exactement la même annotation et que Maven ne se plaignait pas de ces classes.J'ai remarqué que cette classe avait les importations arrangées différemment que le reste. Quand je l'ai changé pour correspondre aux autres, maven construit sans problème. – Glenn