2010-08-24 8 views
0

Je rencontre des difficultés pour appeler l'utilitaire Microsoft Cabinet Maker (makecab) à partir d'un script de traitement par lots sur un serveur Windows Server 2003. Le script de traitement par lots est exécuté par Hudson (service d'intégration continue) installé en tant que service Windows sur la machine.Windows Server 2003 64 bits cmd.exe erreur

Procédé hudson.exe (64 bits) génère un processus java.exe (32 bits), ce qui génère un processus cmd.exe (32 bits), ce qui génère un processus makecab.exe (32 bits). Makecab produit alors une erreur:

D:\Hudson\jobs\Testing\workspace>C:\WINDOWS\system32\makecab.exe /F "D:\Build\2.3.278.40859.cab.df" 
Microsoft (R) Cabinet Maker - Version 5.2.3790.0 
Copyright (c) Microsoft Corporation. All rights reserved.. 

Parsing directives 
Parsing directives (D:\Build\2.3.278.40859.cab.df: 1 lines) 

D:\Build\2.3.278.40859.cab.df(12): ERROR: 

Cependant, si j'ouvre une connexion de bureau à distance au serveur et ouvrir une fenêtre d'invite de commande et exécutez MakeCab cela fonctionne parfaitement. Mais j'ai remarqué que l'exécution de cmd.exe à partir de Démarrer> Exécuter génère un processus 64 bits, qui exécute ensuite un processus makecab 64 bits. Est-ce que quelqu'un peut expliquer pourquoi le makecab 32 bits peut être en train de lancer une erreur? L'exécutable existe à la fois dans C:\WINDOWS\system32 et C:\WINDOWS\SysWOW64.

Est-il possible, à partir du script batch 32 bits cmd.exe qui java.exe fraie et exécute, pour exécuter la version 64 bits de makecab.exe (autres que la copie de l'exécutable physique de C:\WINDOWS\system32 à C:\WINDOWS\SysWOW64)?

Merci

+0

Quelle est votre commande dans "Execute Windows Batch Shell" (si vous utilisez ceci)? – Sagar

+0

C: \ WINDOWS \ system32 \ makecab.exe/F «D: \ Build \ 2.3.278.40859.cab.df» –

Répondre

1

Celui-ci est assez évident pour moi maintenant. Hudson est configuré pour exécuter la version 32 bits de Java, en hudson.xml:

<executable>C:\Program Files (x86)\Java\jre6\bin\java</executable> 

L'exécutable Java 32 bits est fraie un cmd.exe 32 bits. Tout ce que j'ai besoin de faire est d'utiliser la version 64 bits de Java (disponible ici: https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewFilteredProducts-SingleVariationTypeFilter) et de le pointer dans hudson.xml.

Le seul problème est qu'il ressemble à Hudson plug-in Active Directory ne fonctionne pas avec Java 64 bits ..

24-Aug-2010 19:39:52 hudson.WebAppMain$2 run 
SEVERE: Failed to initialize Hudson 
org.jvnet.hudson.reactor.ReactorException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'activeDirectory': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [hudson.plugins.active_directory.ActiveDirectoryUnixAuthenticationProvider]: Constructor threw exception; nested exception is java.lang.NullPointerException 
    at org.jvnet.hudson.reactor.Reactor.execute(Reactor.java:246) 
    at hudson.model.Hudson.executeReactor(Hudson.java:689) 
    at hudson.model.Hudson.<init>(Hudson.java:606) 
    at hudson.model.Hudson.<init>(Hudson.java:546) 
    at hudson.WebAppMain$2.run(WebAppMain.java:222) 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'activeDirectory': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [hudson.plugins.active_directory.ActiveDirectoryUnixAuthenticationProvider]: Constructor threw exception; nested exception is java.lang.NullPointerException 
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:231) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:957) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:869) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:514) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:485) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:455) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:251) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:169) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:248) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:170) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:413) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:735) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:369) 
    at hudson.util.spring.DefaultRuntimeSpringConfiguration.getApplicationContext(DefaultRuntimeSpringConfiguration.java:94) 
    at hudson.util.spring.BeanBuilder.createApplicationContext(BeanBuilder.java:388) 
    at hudson.plugins.active_directory.ActiveDirectorySecurityRealm.createSecurityComponents(ActiveDirectorySecurityRealm.java:62) 
    at hudson.security.SecurityRealm.getSecurityComponents(SecurityRealm.java:359) 
    at hudson.security.HudsonFilter.reset(HudsonFilter.java:134) 
    at hudson.model.Hudson.setSecurityRealm(Hudson.java:1767) 
    at hudson.model.Hudson$13.run(Hudson.java:2165) 
    at org.jvnet.hudson.reactor.TaskGraphBuilder$TaskImpl.run(TaskGraphBuilder.java:146) 
    at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:259) 
    at hudson.model.Hudson$3.runTask(Hudson.java:671) 
    at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:187) 
    at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:94) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [hudson.plugins.active_directory.ActiveDirectoryUnixAuthenticationProvider]: Constructor threw exception; nested exception is java.lang.NullPointerException 
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:98) 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:87) 
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:225) 
    ... 28 more 
Caused by: java.lang.NullPointerException 
    at hudson.plugins.active_directory.ActiveDirectoryUnixAuthenticationProvider.<init>(ActiveDirectoryUnixAuthenticationProvider.java:52) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:83) 
    ... 30 more 
+1

J'ai créé un JIRA pour le bogue du plugin Active Directory: http: //issues.hudson- ci.org/browse/HUDSON-7286 –

0

Il semble que vous spécifiez le chemin d'accès MakeCab. Ma suggestion serait de ne pas faire ça. Makecab est déjà dans le chemin par défaut quand cmd.exe démarre, et en spécifiant le chemin d'accès, vous le forcer à être utilisé. Si vous appelez makecab.exe directement, cmd.exe choisira le droit maintenant. AFAIK, vous ne pouvez pas exécuter le 64 bits de makecab à partir de la version 32 bits de cmd. Ça ne marchera pas.

Il semble que makecab se plaint du fichier de directives. Pouvez-vous poster le contenu de votre fichier de directives?

En outre, je crois que l'extension du fichier directives devrait être .ddf, pas .df (bien que je ne suis pas sûr à quel point d'un autre il fait).

+0

Utilisez: ** makecab.exe/F "D: \ Build \ 2.3.278.40859.cab.df "** PAS C: \ WINDOWS \ system32 \ makecab.exe/F" D: \ Build \ 2.3.278.40859.cab.df " – Sagar

1

l'aide d'une machine virtuelle Java 64 bits devrait résoudre votre problème de racine.

Pour résoudre le problème Active Directory avec Hudson, vous devez spécifier le nom de domaine (configuration avancée) lors de l'utilisation du plug-in Active Directory sur les machines virtuelles Java 64 bits.

En raison d'un problème com4j avec Win64, le plug-in Active Directory uses the unix implementation sur Windows 64 bits.

Questions connexes