Why doesn't NetBeans IDE see the generated sources?

只愿长相守 提交于 2020-06-09 16:43:05

问题


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 builds the JPA meta-model in the directory

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

Yet the IDE doesn't see the classes defined there. Little red dots with an exclamation point everywhere. Yet I can navigate to those files in the Projects window and open the generated source files.

Does this happen to anyone else and does anyone know of a way to fix it?

UPDATE:

As a work-around I have discovered that I can exit NetBeans, delete the NetBeans cache directory, then restart. This forces NetBeans to rebuild the cache and then the classes become visible again. Should I submit a bug to the NetBeans bug tracker? I can't come up with a test case to make it happen, but it does fairly often.


回答1:


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.




回答2:


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




回答3:


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




回答4:


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.




回答5:


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.



来源:https://stackoverflow.com/questions/9847483/why-doesnt-netbeans-ide-see-the-generated-sources

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!