2012-06-21 19 views
5

Actualmente estoy enfrentando problemas cuando uso Maven con NetBeans 7.1. He incluido una lib que no puedo colocar en un repositorio de Maven en el alcance del sistema. Se ve algo como lo siguiente:NoClassDefFoundError cuando se usa el alcance del sistema

<dependency> 
    <groupId>org.company</groupId> 
    <artifactId>FBTM</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <scope>system</scope> 
    <systemPath>${project.basedir}/lib/FBTM-1.0-SNAPSHOT.jar</systemPath> 
</dependency> 

El IDE parece recoger este fino dependencia, ya que muestra en la carpeta Dependencias (vista del proyecto) y yo soy capaz de ver el contenido del tarro. También puedo importar clases desde el contenedor sin ningún problema.

Sin embargo, cuando intento ejecutar mi proyecto (y el tiempo de ejecución tiene alguna de las clases en uso) obtengo un NoClassDefFoundError para la clase en cuestión. Puede ser cualquier clase.

StackTrace:

Exception in thread "main" java.lang.NoClassDefFoundError: com/company/otaupdate/sim/commands/Select at com.company.fbtranslationlibrary.mc.scripts.UserData$1.<init>(UserData.java:30) at com.company.fbtranslationlibrary.mc.scripts.UserData.<init>(UserData.java:28) at com.company.fbtranslationlibrary.mc.MS.get_profile_script(MuscadeScript.java:80) at com.company.fbtranslationlibrary.mc.MS.access$300(MS.java:16)

Cualquier ayuda o punteros sería muy apreciada!

+1

Problemas resolver '$ {}' project.basedir, tal vez? – m0skit0

+0

alcance: el sistema se siente mal, ¿necesita que sea así? ¿O puedes probar con ninguno (o compilar)? – esej

+0

¿Cuál es el rastro de la pila/mensaje de excepción exacto? – Attila

Respuesta

2

Para el alcance del sistema:

Maven Doc dice:

sistema

Este ámbito es similar al de siempre, excepto que usted tiene que proporcionar al JAR que contiene explícitamente. El artefacto siempre está disponible y no se busca en un repositorio.

Su IDE proporciona el tarro de alguna manera. Pero cuando ejecuta , usted necesita proporcionarlo.

Pruebe con el alcance predeterminado (es decir, sin etiqueta de alcance).

edit: Si desea que maven mantenga el alcance del sistema, debe proporcionar el tiempo de ejecución del jar a través del classpath.

+3

El uso de una etiqueta de ámbito no conduce a que la etiqueta systemPath sea inválida. – krslynx

0

Parece que el ejecutante de la aplicación NetBeans no es lo suficientemente inteligente como para poner este archivo JAR en el classpath de ejecución.

¿Por qué no agrega los archivos JAR y POM para esta dependencia a su repositorio local? Entonces puedes usar una dependencia regular.

Como alternativa, vea si hay una manera de ajustar el classpath en tiempo de ejecución para el iniciador de aplicaciones NetBeans para esta aplicación. (No estoy seguro de que estoy usando la terminología aquí ... Soy una persona Eclipse.)

+0

Solo puedo proporcionar el JAR para esta dependencia, ya que no es un proyecto m2. ¿Esto sería suficiente? – krslynx

0

he resuelto este problema mediante la creación de la siguiente build.xml para el proyecto:

<!-- make the repo dir --> 
    <mkdir dir="${m2.home}" /> 

    <!-- copy libs --> 
    <copy todir="${m2.home}"> 
     <fileset dir="dist"/> 
    </copy> 

    <!-- copy pom --> 
    <copy todir="${m2.home}"> 
     <fileset dir="pom"/> 
     <mapper> 
      <mapper type="regexp" 
       from="pom.xml" to="${m2.app.name}-${m2.app.ver}.pom" /> 
     </mapper> 
    </copy> 

    <!-- use naming policy --> 
    <copy todir="${m2.home}"> 
     <fileset dir="dist"/> 
     <mapper> 
      <mapper type="regexp" 
       from="${m2.app.name}.jar" to="${m2.app.name}-${m2.app.ver}.jar" /> 
     </mapper> 
    </copy> 

    <!-- remove unnecessiary files --> 
    <delete> 
    <fileset dir="${m2.home}"> 
     <include name="${m2.app.name}.jar"/> 
     <include name="README.TXT"/> 
    </fileset> 
    </delete> 
</target> 

también tuve que crear manualmente un archivo pom.xml para el proyecto, que copio más al repositorio local usando las mismas convenciones de nomenclatura. No es la mejor solución posible, pero funciona bastante bien.

Cuestiones relacionadas