2009-06-04 24 views
1

這是在我的程序最後一次不成功運行之後。我注意到,文件的大小發生了變化,我可以不再運行的Java類爲我的程序:JAR文件在執行期間被修改

[email protected] ~ 
$ ls -l lifecycle-0.1-SNAPSHOT.jar 
-rw-r--r-- 1 root  root  24740243 Jun 4 20:48 lifecycle-0.1-SNAPSHOT.jar 

這是後我複製原始的JAR文件的新副本:

[email protected] ~ 
$ ls -l lifecycle-0.1-SNAPSHOT.jar 
-rw-r--r-- 1 root  root  24833475 Jun 4 20:55 lifecycle-0.1-SNAPSHOT.jar 

我然後運行Java命令:

[email protected] ~ 
$ java -cp lifecycle-0.1-SNAPSHOT.jar com.abc.lifecycle.cli.LifecycleManagerCli -dm web 0001 lm2-dom0.sfbay.abc.com ZONE /path/to/bits 
Jun 4, 2009 8:55:51 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh 
INFO: Refreshing org[email protected]186c6b2: display name [org[email protected]186c6b2]; startup date [Thu Jun 04 20:55:51 GMT+00:00 2009]; root of context hierarchy 
Jun 4, 2009 8:55:51 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 
INFO: Loading XML bean definitions from class path resource [lifecycle_lite.xml] 
Jun 4, 2009 8:55:51 PM org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory 
INFO: Bean factory for application context [org[email protected]186c6b2]: org.s[email protected]88e2dd 
Jun 4, 2009 8:55:51 PM org.springframework.core.io.support.PropertiesLoaderSupport loadProperties 
INFO: Loading properties file from class path resource [lifecycle.properties] 
Jun 4, 2009 8:55:51 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons 
INFO: Pre-instantiating singletons in org.s[email protected]88e2dd: defining beans [org.springframework.beans.factory.config.PropertyPlaceholderConfigurer#0,com.abc.lifecycle.util.LoggingConfigurer#0,transactionManager,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,txAdvice,lifecycleOperations,org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor#0,dataSource,hibernateSessionFactory,moduleDefinitionDao,moduleHostDao,moduleInstanceDao,physicalHostDao,serviceDefinitionDao,serviceInstanceDao,numericOffsetDao,virtualHostDao,broker,jmsConnectionFactory,lifecycleMessageQueue,lifecycleMessageXmlConverter,lifecycleMessageListener,lifecycleMessageListenerContainer,jmsTemplate,lifecycleProcessor,statusChecker,lifecycleComponentBuilder,lifecycleManagerInitializer,lifecycleManagerCli]; root of factory hierarchy 
Hibernate: 
    insert 
    into 
     SERVICE_INSTANCE 
     (CREATED_DATE, OPTIMISTIC_LOCKING_VERSION, UPDATED_DATE, MODULE_INSTANCE_ID, serviceDefinition_ENTITY_ID) 
    values 
     (?, ?, ?, ?, ?) 
Hibernate: 
    delete 
    from 
     NUMERIC_OFFSET 
    where 
     ENTITY_ID=? 
     and OPTIMISTIC_LOCKING_VERSION=? 
Exception in thread "lifecycleMessageListenerContainer-1" java.lang.NoClassDefFoundError: org/springframework/jms/support/JmsUtils 
     at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.clearResources(DefaultMessageListenerContainer.java:1024) 
     at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:887) 
     at java.lang.Thread.run(Thread.java:619) 
Caused by: java.lang.ClassNotFoundException: org.springframework.jms.support.JmsUtils 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:200) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:188) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:252) 
     at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) 
     ... 3 more 

在這一點上,我用Ctrl-C殺死它:

^CException in thread "ActiveMQ ShutdownHook" java.lang.NoClassDefFoundError: org/apache/activemq/broker/TransportConnection$3 
     at org.apache.activemq.broker.TransportConnection.stopAsync(TransportConnection.java:920) 
     at org.apache.activemq.broker.TransportConnection.stop(TransportConnection.java:902) 
     at org.apache.activemq.util.ServiceStopper.stop(ServiceStopper.java:41) 
     at org.apache.activemq.broker.TransportConnector.stop(TransportConnector.java:270) 
     at org.apache.activemq.util.ServiceSupport.dispose(ServiceSupport.java:43) 
     at org.apache.activemq.transport.vm.VMTransportFactory.stopped(VMTransportFactory.java:226) 
     at org.apache.activemq.broker.BrokerService.stop(BrokerService.java:518) 
     at org.apache.activemq.broker.BrokerService.containerShutdown(BrokerService.java:1754) 
     at org.apache.activemq.broker.BrokerService$4.run(BrokerService.java:1732) 
Caused by: java.lang.ClassNotFoundException: org.apache.activemq.broker.TransportConnection$3 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:200) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:188) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:252) 
     at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) 
     ... 9 more 

然後你就可以看到JAR文件已被更改:

[email protected] ~ 
$ ls -l lifecycle-0.1-SNAPSHOT.jar 
-rw-r--r-- 1 root  root  24740243 Jun 4 20:56 lifecycle-0.1-SNAPSHOT.jar 

我可以找到JmsUtils類,它是在抱怨我的Maven倉庫中的ActiveMQ TransportConnection類,我還有什麼可嘗試一下呢?

[email protected] ~ 
$ jar tf lifecycle-0.1-SNAPSHOT.jar | grep JmsUtils 
org/springframework/jms/support/JmsUtils.class 
[email protected] ~ 
$ jar tf lifecycle-0.1-SNAPSHOT.jar | grep TransportConnection            
org/apache/activemq/broker/MapTransportConnectionStateRegister.class 
org/apache/activemq/broker/SingleTransportConnectionStateRegister.class 
org/apache/activemq/broker/TransportConnection$1.class 
org/apache/activemq/broker/TransportConnection$2.class 
org/apache/activemq/broker/TransportConnection$3.class 
org/apache/activemq/broker/TransportConnection.class 
org/apache/activemq/broker/TransportConnectionState.class 
org/apache/activemq/broker/TransportConnectionStateRegister.class 
org/apache/activemq/broker/jmx/ManagedTransportConnection.class 

在執行期間可以修改JAR文件的狀態是什麼?如果我從遠程機器上連接一個調試器 - 如果這有什麼影響(我認爲不會)?

在此先感謝。

- 詹姆斯

回答

6

首先要嘗試的就是改變你的jar文件的模式444甚至400,看看炸燬。

Java,JRE本身不應該修改jar文件;它只需要讀取權限即可。最可能的情況是某處某處錯誤地獲取了數據文件路徑的jar文件路徑,僅上帝就知道如何。

使文件成爲只讀文件,並且您應該在發生訪問(或至少打開)時發生異常。

+0

當我創建文件444或400權限時,會發生同樣的事情。什麼給 - 文件只能讀取時如何寫入? – 2009-06-05 07:15:22