#!/usr/bin/env python from cygwinreg import * # cygwinreg must be installed from easy_install from re import * from subprocess import * import os import sys import time """ This program is a wrapper that allows cygwin to communicate with native java. Unfortunately, it is necessary to export all cygwin paths to windows paths, as java will not understand the cygwin relative paths. Fortunately, cygwin provides an API to do this, though exporting every environment variable is rather costly (it takes several seconds to do so). This is the only way that we can ensure that java is getting the correct environment parameters that it is expecting. """ PATH_SUFFIX="/bin/java.exe" def cleanpath(path): def quotePath(match): return "/\""+match.group(1)+"\"/" path=path.replace("\\","/") cleanpath= sub ("/(.*?\s.*?)/",quotePath ,path) return cleanpath def getDosPath(path,type="w"): path = cleanpath(path) com ="cygpath -"+type+" "+path try:#try/catch needed for windows 7 forking issues res = Popen(com,shell=True,stdout=PIPE,stderr=PIPE).communicate() if (res[0] == ""): print "Failed on path:\n\t"+path print res[1] raise Exception res= res[0].strip().replace("\t","").replace("\n"," ") except: res = os.popen(com).read().strip().replace("\t","").replace("\n","") return res def getEnv(): environ = os.environ print "Pleas wait, exporting cygwin environment..." start = time.time() for k, v in environ.items(): res = v if (os.path.lexists(v)): try: res=getDosPath(v) except: print "There was an error exporting variable (%s,%s)" % (k,v) environ[k]=res end = time.time() elapsed = end-start print "Exporting environment took "+str(elapsed)+ " seconds." return environ def getJava(): toOpen="SOFTWARE\\JavaSoft\\Java Runtime Environment" key =OpenKey(HKEY_LOCAL_MACHINE,toOpen) version = QueryValueEx(key,"CurrentVersion")[0] subkey = OpenKey(key,version) path = QueryValueEx(subkey,"JavaHome")[0] java_path= cleanpath(path+PATH_SUFFIX) print "Found java "+version+ " at "+path return java_path def runJava(): args = sys.argv args.pop(0) try: jarIndex = args.index("-jar")+1 if (jarIndex < len(args)): args[jarIndex] = cleanpath(getDosPath(args[jarIndex])) except ValueError: print "Not running a jar" print args[len(args)-1] javaCom = getJava() args.insert(0,javaCom) command=" ".join(args) try: Popen(command,shell=True,env=getEnv()) except: os.popen(command) if __name__=="__main__": runJava()