Search code examples
swingnoclassdeffounderrorclassnotfoundexceptionswingxmatisse

NetBeans GUI builder cannot find SwingX classes


I've been thrown into an existing software development project that is using Maven in a NetBeans Java project.

I've fetched the source from the blessed git repo into a freshly installed NetBeans 8. If I build and run it, it runs. :-)

I have to edit the GUI of the program which is created with the NetBeans GUI generator. If I try to open the GUI editor, it always marks some components that extends JXPanel as invalid, because of the following error:

java.lang.NoClassDefFoundError: org/jdesktop/swingx/JXPanel ... caused by java.lang.ClassNotFoundException: org.jdesktop.swingx.JXPanel

I simply do not understand it – the files swingx-1.6.jar and swingx-beaninfo-1.6.jar are in the Dependencies section of the project (without "!"), I've added them to Libraries Manager, and I've added them to Palette. The program runs, but why, why, why can't NetBeans GUI Editor find the classes?

What am I doing wrong?

The following is an excerpt from pom.xml:

<dependency>
    <groupId>org.jdesktop</groupId>
    <artifactId>swingx</artifactId>
    <version>1.6</version>
    <scope>system</scope>
    <systemPath>${basedir}/lib/swingx-1.6.jar</systemPath>
</dependency>
<dependency>
    <groupId>org.jdesktop</groupId>
    <artifactId>swingx.beaninfo</artifactId>
    <scope>system</scope>
    <version>1.6</version>
    <systemPath>${basedir}/lib/swingx-beaninfo-1.6.jar</systemPath>
</dependency>

Solution

  • I got it fixed now – thanks to @Asprise Support, who pushed me into the right direction.

    The problem seems to be that matisse cannot handle the <systemPath>${basedir}/... entries in pom.xml indeed.

    So, the only thing one has to do is to load the dependencies from a repository. If they are already in some repository: Great. If not, create your own local one and refer to it:

    1. Create a repository directory in your project, eg maven-repo
    2. Deploy the jars into it: mvn deploy:deploy-file -Durl=file://<absolute-path-to-repo> -Dfile=<path-to-jar> -DgroupId=<groupId-from-pom.xml> -DartifactId=<artifactId-from-pom.xml> -Dpackaging=jar -Dversion=<version-from-pom.xml>
    3. Add the new repository to pom.xml:

      <repositories>
          <repository>
              <id>someGreatName</id>
              <url>file://${basedir}/theNameOfYourRepositoryFolder</url>
          </repository>
      </repositories>
      

    (The last two steps come from https://devcenter.heroku.com/articles/local-maven-dependencies)

    1. Just to be sure, empty the local Maven cache, located in ~/.m2/repository or C:\Users\<yourUserName>\.m2\repository
    2. Launch the application to let Maven download all the dependencies.

    Now, Matisse should work – it doesn't understand the new ${basedir} in the pom.xml either, but Maven does, and Matisse gets the dependencies from Maven's cache afterwards (imho).