2009-09-05 3 views
0

Я пытаюсь читать сценарии базы данных в файл Jar, так что я могу разделить мои файлы import.sql столько раз, сколько сочту нужным.Чтение файлов внутри JAR-файла

Например, у меня есть несколько проектов, или модулей, которые обеспечивают справочные данные, поэтому у меня есть несколько отдельных сценариев в каждом проекте, который заявляет, что. Вместо того, чтобы иметь один большой import.sql, мой подход состоял в том, чтобы разделить его, чтобы сделать его более читаемым, а также сохранить данные в одном месте, поэтому, если у меня есть несколько проектов веб-приложений, мне не нужно обновлять и поддерживать эти файлы в отдельности.

Я думаю, что у меня проблема с javassist. Я создал вспомогательный класс (в модуле FileIO), который просто ищет заданное имя, а затем для всех совпадений он попытается прочитать конфигурацию, найти сценарии базы данных , читайте их по строкам и возвращайте объект, который я могу выполнить итеративно для выполнения запросов.

Когда я называю это вспомогательный класс (от моего Seam проекта), я получаю NoSuchMethodError. Если я переведу все эти функции обратно в компонент Seam, из которого происходит звонок, он работает большую часть пути. Последняя проблема заключается в том, что, если у меня есть более одного файла конфигурации, по какой-то нечетной причине, хотя URL-адрес указывает на правильный файл конфигурации, используется только первый из них?

Я использую JBoss Seam 2.2.0.GA, Javassist 3.11.0.GA и гибернации Entity менеджер 3.4.0.GA.

Seam Компонент

@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(); 
       } 
      } 
     } 

Helper Методы:

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))); 
    } 

Я использую API Java должным образом, это проблема с Javassist? Любые мысли и предложения приветствуются.

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) 

Спасибо, Walter

+1

Возможно, вы захотите дать более подробную информацию о броске NoSuchMethodError. Он часто указывает, что класс был перекомпилирован с изменениями, сделанными по крайней мере по одному методу, без повторной компиляции зависимых классов. –

+0

Я добавил еще несколько комментариев, я не думаю, что они помогут многим, кроме указания того, что класс FileReader работает не так, как хотелось бы. Walter – 2009-09-10 02:52:06

+0

Возможный дубликат [Как прочитать файл из jar в Java?] (Http://stackoverflow.com/questions/3369794/how-to-a-read-file-from-jar-in-java) – Qix

ответ

1

Я нашел проблему ... Я пометил класс как окончательный. С АОП вы должны быть осторожны, что вы отмечаете как окончательные, иначе это может привести к головной боли. Похож на другой случай преждевременной оптимизации.

Walter

0

NoSuchMethodError возникает при использовании во время выполнения другой версии класса, как во время компиляции. Больше ссылок на файл покажет ваше исключение.

+0

Это имеет смысл - javassist должен модифицировать класс, поскольку он является компонентом Seam. Я посмотрю, смогу ли я снова получить трассировку стека, я внес некоторые существенные изменения в API и не имею этого блока кода, который в настоящее время работает. Walter – 2009-09-08 14:31:37

Смежные вопросы