Why doesn't NetBeans IDE see the generated sources?

后端 未结 6 2181
离开以前
离开以前 2021-02-07 02:55

I have a Maven-built web-app that uses JPA 2.0 at the back end. The JPA provider is EclipseLink 2.3.2.

When I build the project (and it deploys runs successfully) it bu

相关标签:
6条回答
  • 2021-02-07 03:03

    Today I did more experiments on this topic because it is so annoying for me as well. Finally I have realized it is only a problem related how NetBeans deal with indexing classes. This is not a problem of the target directory name and not a problem of the project. It is only NetBeans' mistake. So I have created an issue as well hopefully NetBeans Team can bring the final solution soon. You can see my ticket here https://issues.apache.org/jira/browse/NETBEANS-4191

    In my environment the NetBeans 11.3 (x64) with openJDK 1.8.0_242-b08 and apache-maven 3.6.3 version is used under Windows 10 (1607).

    But until the final solution arrives here is what I did as a workaround solving the symbol not found problem.

    I have added a profile section to my pom file:

    <profile>
    <id>nb-modelgen-fix</id>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <version>3.0.0</version>
                <executions>
                    <execution>
                        <id>modelgen-touch-files</id>
                        <phase>install</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <target>
                                <touch>
                                    <fileset id="model.elements" dir="src/main/java" includes="**/*.java">
                                        <containsregexp expression="(@Entity|@MappedSuperclass|@Embeddable)" casesensitive="yes" />
                                    </fileset>
                                </touch>
                            </target>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    </profile>
    

    I am using the following simple solution to generate the metamodel classes in my project:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <annotationProcessors>
                <annotationProcessor>
                    org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor
                </annotationProcessor>
            </annotationProcessors>
            <compilerArgs>
                <arg>-Aeclipselink.persistenceunits=MY-PU</arg>
            </compilerArgs>
            <source>1.8</source>
            <target>1.8</target>
        </configuration>
    </plugin>
    

    And of course a maven-build-helper adding the generated source folders to the project:

    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <version>3.1.0</version>
        <executions>
            <execution>
                <id>add-source</id>
                <phase>generate-sources</phase>
                <goals>
                    <goal>add-source</goal>
                </goals>
                <configuration>
                    <sources>
                        <source>${project.build.directory}/generated-sources/annotations</source>
                        <source>${project.build.directory}/generated-sources/wsimport</source>
                    </sources>
                </configuration>
            </execution>
        </executions>
    </plugin>
    

    And also I have created a file in the same place where the pom.xml is located called nbactions.xml with the following content (to activate this profile in NetBeans IDE only)

    <?xml version="1.0" encoding="UTF-8"?>
    <actions>
    <action>
        <actionName>rebuild</actionName>
        <packagings>
            <packaging>*</packaging>
        </packagings>
        <goals>
            <goal>clean</goal>
            <goal>install</goal>
        </goals>
        <activatedProfiles>
            <activatedProfile>nb-modelgen-fix</activatedProfile>
        </activatedProfiles>
    </action>
    </actions>
    

    What it does? When you execute the "Clean and Build" action in NetBeans IDE it activates a task (implemented easily with maven-antrun-plugin) which just a simple touch on all JPA annotated with @Entity, @MappedSuperClass or @Embeddable theese are the sources for the metamodel generations. I have attached this task to the install phase but it worked as well in other phases as well. It lookes that this way NetBeans wake up and makes for the missing indexes for the metamodel classess.

    You can read more on this in my NetBeans' issue ticket.

    I hope this can save time for anybody else.

    0 讨论(0)
  • 2021-02-07 03:06

    After reading @jeqo answer, I tested if, by manually renaming:

     "${project.build.directory}/generated-sources/annotations" to ".../generated-sources/hibernate-jpamodelgen" 
    

    would make a difference to Nebeans (I'm using v8.2 on ubuntu 16.04).

    Everything worked like a charm.

    I then modified the pom file as follows:

    1) removed the "org.hibernate: hibernate.jpamodelgen" dependency.

    2) configured the maven-compiler-plugin as follows:

       <plugin>
        <groupId>>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.6.1</version>
        <configuration>
          <compilerArgument>-proc:none</compilerArgument>        
        </configuration>
      </plugin>
    
    • These two steps is to make sure that the hibernate-jpamodelgen does not run on auto-pilot just by adding it in the project dependency list. Please refer to JPA Static MetaModel Generator doc.

    3) added the following plugin with configuration

      <plugin>
        <groupId>org.bsc.maven</groupId>
        <artifactId>maven-processor-plugin</artifactId>
        <version>3.2.0</version>
        <executions>
          <execution>
            <id>process</id>
            <goals>
              <goal>process</goal>
            </goals>
            <phase>generate-sources</phase>
            <configuration>
              <processors>
                <processor>org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor</processor>
              </processors>
              <defaultOutputDirectory>${project.build.directory}/generated-sources/hibernate-jpamodelgen/</defaultOutputDirectory>
            </configuration>
          </execution>
        </executions>
        <dependencies>
          <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-jpamodelgen</artifactId>
            <version>5.2.9.Final</version>
          </dependency>
        </dependencies>
      </plugin>
    

    This config is directly from the Hibernate JPA Static Metamodel Generator documentation page except for the following line:

    <defaultOutputDirectory>${project.build.directory}/generated-sources/hibernate-jpamodelgen/</defaultOutputDirectory>
    

    This line simply generates the metamodel in the directory named after the maven plugin name. From this point, I got all Netbeans references working at design time as if the generated classes were in the src directory subtree.

    Hope this helps,

    J

    0 讨论(0)
  • 2021-02-07 03:07

    If you are using jaxws then make sure you add a <sourceDestDir> node to the <configuration> section of the jaxws plug-in "artifact" in the appropriate pom. For example:

            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>jaxws-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>dojaxws</goal>
                        </goals>
                        <configuration>
                            <sourceDestDir>${project.build.directory}/generated-sources/jaxws</sourceDestDir>
                            ....
                        </configuration>
                    </execution>
                </executions>
                <configuration>
                    <wsdlDirectory>src/main/resources/com/mystuff/ws</wsdlDirectory>
                    <bindingDirectory>src/jaxws/binding</bindingDirectory>
                    <target>2.0</target>
                </configuration>
            </plugin>
    

    As explained above and as noted by netbeans, you must use the generate-sources path appended with the "plug-in" name. Hopefully the above clears up what "plug-in name" means and how exactly one is supposed to get jaxws to put the generated sources where netbeans need them to be. Clearly the "configuration" section will be different for each plugin... The node <sourceDestDir> is needed for jaxws, other plugins may use something else.

    0 讨论(0)
  • 2021-02-07 03:18

    Sometimes Netbeans has troubles refreshing. Perhaps clean and rebuild the project and restart Netbeans?

    0 讨论(0)
  • 2021-02-07 03:20

    If you go to project properties/sources there is a note about this: you need to generate sources under

    ${basedir}/target/generated-sources/FOOBAR 
    

    where FOOBAR is the name of your plugin.

    0 讨论(0)
  • 2021-02-07 03:22

    For me it worked after I added <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir> to the <properties> of the pom.xml, e.g.:

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <jakartaee>8.0</jakartaee>
    </properties>
    

    But I have no explanation why.

    0 讨论(0)
提交回复
热议问题