понеділок, 21 вересня 2009 р.

Jar, Method.invoke() и удары головой об стену


Это называется - как проФтыкать так, что-бы голова болела 4 дня. Есть уу меня программа, которая занимается тем, что-бы запускать другие приложения. Сами приложения могут запускаться самостоятельно, и представляют собой отдельные и независящие друг от друга модули. В общем, запускаются они так:


Attributes attr = jarFile.getManifest().getMainAttributes();
mainClass=attr.getValue("Main-Class")
URL[] urls = { new URL("file:" + jarName) };
URLClassLoader cl = new URLClassLoader(urls);
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(cl);
Class cMainClass = cl.loadClass(mainClass);
Method main = cMainClass.getMethod("main", new Class[] {String[].class});
main.invoke(cMainClass.newInstance(), new Object[] { new String[] {""}});


Все замечательно работало, пока мой коллега не попросил доработать один модуль для того, что-бы он заработал под виндой. И тут понеслось.... После обновления модуля все перестало работать ((( Но! под линуксом работало нормально. Сначала я грешил на новую версию явы и на реализацию Method.invoke(). И после 4-х дней безрезультатных гуглений (:)), трассировок и перечитки кода ничего так и не прояснилось, пока я случайно не решил попробовать подлаживать модули по одному. В результате паршивая овца была найдена! Причина оказалась в следующем:


if(!System.getProperties("user.name").equals("root") && System.getProperties("os.name").equals("Linux")){
System.exit(0);
}

Немає коментарів:

Дописати коментар