3

Why is my mvn clean install command telling me that it Cannot find Symbol, when the class that it complains about seems to clearly be available?

I am building a library that handles calls to a REST api (HP ALM). It returns xml, and so I have to parse the results.

The library is pretty much done, and works, but now I want to test it in a bigger gui application, and so I need to build and install the .jar to my local maven repository. There has been no (relevant) errors during development of the library.

Here is the error I am getting when running 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

Now, I have read that there might be a bug with the compiler plugin 2.3.2, so I have tried multiple other versions of the plugin. Here is 3.1's response:

[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:3.1:compile (default-compile) @ rest-qc ---
[INFO] Changes detected - recompiling the module!
[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] /C:/Data/workspaces/MRPB/workspace/rest-qc/src/main/java/infrastructure/Entity.java:[172,10] cannot find symbol
  symbol:   class XmlAccessorType
  location: class infrastructure.Entity
[ERROR] /C:/Data/workspaces/MRPB/workspace/rest-qc/src/main/java/infrastructure/Entity.java:[173,10] cannot find symbol
  symbol:   class XmlType
  location: class infrastructure.Entity
[INFO] 2 errors
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.668 s
[INFO] Finished at: 2016-08-26T10:32:14+02:00
[INFO] Final Memory: 13M/163M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project rest-qc: Compilation failure: Compilation
 failure:
[ERROR] /C:/Data/workspaces/MRPB/workspace/rest-qc/src/main/java/infrastructure/Entity.java:[172,10] cannot find symbol
[ERROR] symbol:   class XmlAccessorType
[ERROR] location: class infrastructure.Entity
[ERROR] /C:/Data/workspaces/MRPB/workspace/rest-qc/src/main/java/infrastructure/Entity.java:[173,10] cannot find symbol
[ERROR] symbol:   class XmlType
[ERROR] location: class infrastructure.Entity
[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

They both give almost the same error. 3.1 has the same line numbers as 2.3.2, but the character index varies from 2->10. Also, 3.1 tells specifically which classes that causes the error. The Entity-class is a standard generated class for interpreting results from the REST calls. All results objects will come in the Entity format.

For reference, here is my pom.xml. I have manually checked the jaxb-bind dependency jar to check if the relevand annotation class is in the library. And it is.

<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, the Entity-class (I have manually added a toString-method)

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();
    }
}
jumps4fun
  • 3,635
  • 9
  • 45
  • 84

2 Answers2

1

I assume that your version you have defined as dependency

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

is too old. So I would suggest to use a newer version like

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.2.12</version>
</dependency>
khmarbaise
  • 81,692
  • 23
  • 160
  • 199
  • I've experimented with this setup for a long time. I have not written down all the things I have done, so I do not remember all of them by heart. Also, I try to keep the question as precise, but clean as possible. I appreciate your attempt to help though. – jumps4fun Aug 26 '16 at 10:16
-1

I had the exact same issue. The solution was to change the order of the import statements. In your case, put this import statement last and rebuild.

import infrastructure.Entity.Fields.Field;

Glenn
  • 31
  • 4
  • 1
    The order of individual `import` statements in Java does not matter – avojak Mar 14 '17 at 17:43
  • That was my thought, but changing the order of the imports fixed the issue for me. I spoke with some other developers at my company and nobody has a good explanation about why changing the order fixes it, but it does. The only reason I came upon this solution was that there were other classes in the same project using the exact same annotation and maven wasn't complaining about those classes. I noticed that this class had the imports arranged differently than the rest. When I changed it to match the others, maven built without issue. – Glenn Mar 14 '17 at 19:19