2009-09-05 7 views
0

J'essaye de lire des scripts de base de données dans un fichier Jar afin de pouvoir séparer mes fichiers import.sql autant de fois que je le souhaite. Par exemple, j'ai plusieurs projets ou modules qui fournissent des données de référence, j'ai donc quelques scripts séparés dans chaque projet qui le déclare. Au lieu d'avoir une grande import.sql, mon approche était de la scinder pour la rendre plus lisible et de garder les données au même endroit, donc si j'ai plusieurs projets d'application web, je n'ai pas besoin de redéclare et de maintenir ces fichiers séparément. Je pense avoir un problème avec javassist - J'ai créé une classe d'assistance (dans le module, FileIO) qui cherche simplement un nom donné, puis pour toutes les correspondances, elle essaie de lire la configuration, de localiser les scripts de base de données , lisez-les ligne par ligne et renvoyez un objet que je peux itératif pour exécuter les requêtes. Lorsque j'appelle cette classe auxiliaire (à partir de mon projet Seam), j'obtiens NoSuchMethodError. Si je replace toutes ces fonctionnalités dans le composant Seam d'origine de l'appel, cela fonctionne le plus souvent. Le dernier problème étant, si j'ai plus de 1 fichier de configuration, pour une raison étrange, même si l'URL pointe vers le bon fichier de configuration, seul le premier est utilisé? J'utilise JBoss Seam 2.2.0.GA, Javassist 3.11.0.GA et Hibernate Entity Manager 3.4.0.GA.Lire des fichiers dans un fichier JAR

Seam Component

@Observer("org.jboss.seam.postInitialization") 
     @Transactional 
     public void prepareDatabase() throws IOException 
     { 
      log.debug(getVersions()); 
      log.debug("initializing database"); 

      List<DatabaseImport> databaseImports = DatabaseImporter.getImports(); 

      for(DatabaseImport databaseImport : databaseImports) 
      { 
       for(String query : databaseImport.getQueries()) 
       { 
        // ensure we don't create blank queries or ones that are comments only 
        if(StringUtils.isNotBlank(query) && !query.startsWith("--")) 
         entityManager.createNativeQuery(query).executeUpdate(); 
       } 
      } 
     } 

Méthodes d'aide:

public static List<String> readFromStream(final InputStream inputStream) 
                     throws IOException 
    { 
     List<String> lines = new ArrayList<String>(); 
     BufferedReader reader = null; 

     try 
     { 
      reader = new BufferedReader(new InputStreamReader(inputStream)); 

      String line = null; 

      while((line = reader.readLine()) != null) 
       lines.add(line); 
     } 
     finally 
     { 
      if(reader != null) 
       reader.close(); 
     } 

     return (lines); 
    } 

    public static List<String> readFromClassLoader(final String name) 
                        throws IOException 
    { 
     return (readFromStream(Thread.currentThread().getContextClassLoader().getResourceAsStream(name))); 
    } 

    public static String toString(List<String> lines) throws IOException 
    { 
     StringBuilder buffer = new StringBuilder(); 

     for(String line : lines) 
      buffer.append(line); 

     return (buffer.toString()); 
    } 

    public static List<String> readLinesFromURL(URL url, ClassLoader classLoader, List<String> names) 
                      throws IOException 
    { 
     URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{url}, classLoader); 

     List<String> lines = new ArrayList<String>(); 

     for(String name : names) 
      lines.addAll(readLinesFromURL(urlClassLoader, name)); 

     return (lines); 
    } 

    public static List<String> readLinesFromURL(URL url, ClassLoader classLoader, final String name) 
                      throws IOException 
    { 
     return (readLinesFromURL(new URLClassLoader(new URL[]{url}, classLoader), name)); 
    } 

    public static List<String> readLinesFromURL(URLClassLoader urlClassLoader, final String name) 
                      throws IOException 
    { 
     return (readFromStream(urlClassLoader.getResourceAsStream(name))); 
    } 

    public static String readAsString(final File file) throws IOException 
    { 
     return (new String(read(file))); 
    } 

J'utilise l'API Java correctement, est-ce un problème avec javassist? Toutes les pensées et suggestions sont appréciées.

EDIT: StackTrace

java.lang.RuntimeException: exception invoking: prepareDatabase 
    at org.jboss.seam.util.Reflections.invokeAndWrap(Reflections.java:154) 
    at org.jboss.seam.Component.callComponentMethod(Component.java:2249) 
    at org.jboss.seam.core.Events.raiseEvent(Events.java:85) 
    at org.jboss.seam.contexts.ServletLifecycle.endInitialization(ServletLifecycle.java:118) 
    at org.jboss.seam.init.Initialization.init(Initialization.java:740) 
    at org.jboss.seam.servlet.SeamListener.contextInitialized(SeamListener.java:36) 
    at org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:548) 
    at org.mortbay.jetty.servlet.Context.startContext(Context.java:136) 
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1239) 
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517) 
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:466) 
    at org.mortbay.jetty.plugin.Jetty6PluginWebAppContext.doStart(Jetty6PluginWebAppContext.java:124) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50) 
    at org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:152) 
    at org.mortbay.jetty.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:156) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50) 
    at org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:152) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50) 
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130) 
    at org.mortbay.jetty.Server.doStart(Server.java:222) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50) 
    at org.mortbay.jetty.plugin.Jetty6PluginServer.start(Jetty6PluginServer.java:132) 
    at org.mortbay.jetty.plugin.AbstractJettyMojo.startJetty(AbstractJettyMojo.java:441) 
    at org.mortbay.jetty.plugin.AbstractJettyMojo.execute(AbstractJettyMojo.java:383) 
    at org.mortbay.jetty.plugin.Jetty6RunWar.execute(Jetty6RunWar.java:67) 
    at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:483) 
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:678) 
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(DefaultLifecycleExecutor.java:553) 
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:523) 
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:371) 
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:332) 
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:181) 
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:356) 
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:137) 
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:362) 
    at org.apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.java:41) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315) 
    at org.codehaus.classworlds.Launcher.launch(Launcher.java:255) 
    at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430) 
    at org.codehaus.classworlds.Launcher.main(Launcher.java:375) 
Caused by: java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.jboss.seam.util.Reflections.invoke(Reflections.java:22) 
    at org.jboss.seam.intercept.RootInvocationContext.proceed(RootInvocationContext.java:32) 
    at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:56) 
    at org.jboss.seam.transaction.RollbackInterceptor.aroundInvoke(RollbackInterceptor.java:28) 
    at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) 
    at org.jboss.seam.core.BijectionInterceptor.aroundInvoke(BijectionInterceptor.java:77) 
    at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) 
    at org.jboss.seam.transaction.TransactionInterceptor$1.work(TransactionInterceptor.java:97) 
    at org.jboss.seam.util.Work.workInTransaction(Work.java:47) 
    at org.jboss.seam.transaction.TransactionInterceptor.aroundInvoke(TransactionInterceptor.java:91) 
    at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) 
    at org.jboss.seam.core.MethodContextInterceptor.aroundInvoke(MethodContextInterceptor.java:44) 
    at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) 
    at org.jboss.seam.intercept.RootInterceptor.invoke(RootInterceptor.java:107) 
    at org.jboss.seam.intercept.JavaBeanInterceptor.interceptInvocation(JavaBeanInterceptor.java:185) 
    at org.jboss.seam.intercept.JavaBeanInterceptor.invoke(JavaBeanInterceptor.java:103) 
    at com.walterjwhite.seamCore.deployment.ApplicationStartupListener_$$_javassist_seam_1.prepareDatabase(ApplicationStartupListener_$$_javassist_seam_1.java) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.jboss.seam.util.Reflections.invoke(Reflections.java:22) 
    at org.jboss.seam.util.Reflections.invokeAndWrap(Reflections.java:144) 
    ... 43 more 
Caused by: java.lang.NoSuchMethodError: com.walterjwhite.io.file.FileReader.readLinesFromURL(Ljava/net/URL;Ljava/lang/ClassLoader;Ljava/lang/String;)Ljava/util/List; 
    at com.walterjwhite.seamCore.persistence.DatabaseImporter.getImports(DatabaseImporter.java:34) 
    at com.walterjwhite.seamCore.deployment.ApplicationStartupListener.prepareDatabase(ApplicationStartupListener.java:80) 

Merci, Walter

+1

Vous pouvez donner plus de détails sur le NoSuchMethodError levé. Il indique souvent qu'une classe a été recompilée avec des modifications apportées à au moins une méthode, sans recompiler les classes dépendantes. –

+0

J'ai ajouté quelques autres commentaires, je ne pense pas qu'ils vont aider beaucoup autre que d'indiquer que la classe FileReader ne fonctionne pas comme je le voudrais. Walter –

+0

duplication possible de [Comment lire un fichier jar en Java?] (Http://stackoverflow.com/questions/3369794/how-to-a-read-file-from-jar-in-java) – Qix

Répondre

1

J'ai trouvé le problème ... J'ai marqué la classe comme finale. Avec AOP vous devez faire attention à ce que vous marquez comme final, sinon cela peut conduire à des maux de tête. On dirait un autre cas d'optimisation prématurée.

Walter

0

Un NoSuchMethodError se produit si vous utilisez lors de l'exécution une autre version de la classe au moment de la compilation. Plus de désillusions montrent votre exception.

+0

Cela a du sens - javassist doit modifier la classe car il s'agit d'un composant Seam. Je vais voir si je peux ré-obtenir la trace de la pile, j'ai fait quelques changements significatifs dans l'API et n'ai pas ce bloc de code qui fonctionne actuellement. Walter –

Questions connexes