Я пытаюсь читать сценарии базы данных в файл 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
Возможно, вы захотите дать более подробную информацию о броске NoSuchMethodError. Он часто указывает, что класс был перекомпилирован с изменениями, сделанными по крайней мере по одному методу, без повторной компиляции зависимых классов. –
Я добавил еще несколько комментариев, я не думаю, что они помогут многим, кроме указания того, что класс FileReader работает не так, как хотелось бы. Walter – 2009-09-10 02:52:06
Возможный дубликат [Как прочитать файл из jar в Java?] (Http://stackoverflow.com/questions/3369794/how-to-a-read-file-from-jar-in-java) – Qix