Has anyone seen problems with mvn 3.0.4 using the maven-native-plugin:1.0-alpha-7 on Windows Server 2008 64-bit using Oracle's Windows 64-bit JVM?
We recently upgraded our nightly build server from 2003 32-bit to 2008 64-bit. Since the upgrade, invocations of the maven-native-plugin are failing when executing the manifest goal http://mojo.codehaus.org/maven-native/native-maven-plugin/manifest-mojo.html http://mojo.codehaus.org/maven-native/native-maven-plugin/lifecycle.html with an error like mt.exe : general error c101008d: Failed to write the updated manifest to the resource of file "C:\dev\someproduct\somecomponent\somecomponent\Win32\target\somecomponent-Win32.exe". The process cannot access the file because it is being used by another process. This appears to be a defect caused by a lock being held by java.exe for a very long time; in my tests it took 48 minutes before java.exe released the lock on the .dll created by the first cmd.exe running link.exe. I don't know what happened after 48 minutes, perhaps something like a call to System.gc(). I was able to time the lock and termine java.exe was holding it because I have a special mt.exe which keeps calling the real mt.exe repeatedly as long as error 31 is returned (31 is the error for file locked). I got the code for this special mt.exe from a workaround posted at http://connect.microsoft.com/VisualStudio/feedback/details/363060/mt-exe-fails-due-to-files-momentarily-locked-by-link-exe Perhaps the defect is in one of the lines of code in org.codehaus.mojo.natives.msvc.MSVCManifest#run not closing a file handle... public void run( ManifestConfiguration config ) throws NativeBuildException { Commandline cl = new Commandline(); cl.setExecutable( "mt.exe" ); cl.setWorkingDirectory( config.getWorkingDirectory().getPath() ); cl.createArg().setValue( "-manifest" ); int manifestType = 0; if ( "EXE".equalsIgnoreCase( FileUtils.getExtension( config.getInputFile().getPath() ) ) ) { manifestType = 1; } else if ( "DLL".equalsIgnoreCase( FileUtils.getExtension( config.getInputFile().getPath() ) ) ) { manifestType = 2; } if ( manifestType == 0 ) { throw new NativeBuildException( "Unknown manifest input file type: " + config.getInputFile() ); } cl.createArg().setFile( config.getManifestFile() ); cl.createArg().setValue( "-outputresource:" + config.getInputFile() + ";" + manifestType ); EnvUtil.setupCommandlineEnv( cl, config.getEnvFactory() ); CommandLineUtil.execute( cl, this.getLogger() ); } For some reason, I can only reproduce this problem when the build is run through a Jenkins maven job. If I try the same maven build from the command line it seems to always work. For the Jenkins case, it doesn't matter whether I run Jenkins from the command like 'java -jar jenkins.war' running as administrator or run jenkins as a service logging on as administrator. This problem did not occur on Windows Server 2003. A similar problem has been worked around in various Ant tasks by checking/waiting for the file status before acting. http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Delete.java?r1=703151&r2=703150&pathrev=703151 http://svn.apache.org/viewvc?view=revision&revision=703151 https://issues.apache.org/bugzilla/show_bug.cgi?id=45960 This is a "clean server" with no antivirus, no indexing, etc. which might cause the file to be locked. Should I open a ticket at http://jira.codehaus.org/browse/MOJO for this issue? This build is running on the following hardware Dell PowerEdge 2950 PERC 5i Serial Attached SCSI This machine has 2 CPUs with 4 cores each (a total of 8 cores). This server is configured with a single C: partition formed from two physical drives in RAID 1. --- Brian Brooks / Sr Software Engineer MS 351-100, Duluth, GA 30096 Phone: (678) 252-4498 bebro...@rockwellcollins.com