• R/O
  • SSH
  • HTTPS

exewrap: Commit


Commit MetaInfo

Revision38 (tree)
Time2017-10-13 14:33:35
Authorhirukawa_ryo

Log Message

* exewrap 1.1.9
Java 9 対応。
Java 9 で java.ext.dirs が廃止されたので外部ライブラリを java.class.path で指定するように変更しました。
Java 9 で不正なリフレクション操作が警告される(将来的には禁止される)ようになったのでシステム・クラスローダーの置き換えを廃止しました。

Change Summary

Incremental Difference

--- exewrap/trunk/exewrap/src/jvm.c (revision 37)
+++ exewrap/trunk/exewrap/src/jvm.c (revision 38)
@@ -24,6 +24,8 @@
2424 BOOL IsDirectory(LPTSTR path);
2525 char* GetSubDirs(char* dir);
2626 char* AddSubDirs(char* buf, char* dir, int* size);
27+char* GetJars(char* dir);
28+char* AddJars(char* buf, char* dir, int* size);
2729 char** GetArgsOpt(char* vm_args_opt, int* argc);
2830 int GetArchitectureBits(const char* jvmpath);
2931 static LPWSTR A2W(LPCSTR s);
@@ -44,9 +46,7 @@
4446 BOOL path_initialized = FALSE;
4547 char binpath[MAX_PATH];
4648 char jvmpath[MAX_PATH];
47-char extpath[MAX_PATH];
4849 char* classpath = NULL;
49-char* extdirs = NULL;
5050 char* libpath = NULL;
5151 HMODULE jvmdll;
5252
@@ -92,12 +92,11 @@
9292 options[1].optionString = opt_app_name;
9393 options[2].optionString = opt_app_version;
9494 options[3].optionString = classpath;
95- options[4].optionString = extdirs;
96- options[5].optionString = libpath;
95+ options[4].optionString = libpath;
9796
9897 vm_args.version = JNI_VERSION_1_2;
9998 vm_args.options = options;
100- vm_args.nOptions = 6;
99+ vm_args.nOptions = 5;
101100 vm_args.ignoreUnrecognized = 1;
102101
103102 if(opt_policy_path[0] != 0x00)
@@ -145,11 +144,6 @@
145144 HeapFree(GetProcessHeap(), 0, classpath);
146145 classpath = NULL;
147146 }
148- if (extdirs != NULL)
149- {
150- HeapFree(GetProcessHeap(), 0, extdirs);
151- extdirs = NULL;
152- }
153147 if (libpath != NULL)
154148 {
155149 HeapFree(GetProcessHeap(), 0, libpath);
@@ -340,10 +334,6 @@
340334 {
341335 classpath = (char*)HeapAlloc(GetProcessHeap(), 0, 64 * 1024);
342336 }
343- if (extdirs == NULL)
344- {
345- extdirs = (char*)HeapAlloc(GetProcessHeap(), 0, 64 * 1024);
346- }
347337 if (libpath == NULL)
348338 {
349339 libpath = (char*)HeapAlloc(GetProcessHeap(), 0, 64 * 1024);
@@ -351,7 +341,6 @@
351341
352342 binpath[0] = '\0';
353343 jvmpath[0] = '\0';
354- extdirs[0] = '\0';
355344 libpath[0] = '\0';
356345
357346 buffer = HeapAlloc(GetProcessHeap(), 0, 64 * 1024);
@@ -408,8 +397,6 @@
408397 SetEnvironmentVariable("JAVA_HOME", jre1);
409398 lstrcpy(binpath, jre1);
410399 lstrcat(binpath, "\\bin");
411- lstrcpy(extpath, jre1);
412- lstrcat(extpath, "\\lib\\ext");
413400 }
414401 else
415402 {
@@ -449,8 +436,6 @@
449436 SetEnvironmentVariable("JAVA_HOME", jre2);
450437 lstrcpy(binpath, jre2);
451438 lstrcat(binpath, "\\bin");
452- lstrcpy(extpath, jre2);
453- lstrcat(extpath, "\\lib\\ext");
454439 }
455440 else
456441 {
@@ -513,8 +498,6 @@
513498 {
514499 lstrcpy(binpath, jre3);
515500 lstrcat(binpath, "\\bin");
516- lstrcpy(extpath, jre3);
517- lstrcat(extpath, "\\lib\\ext");
518501 FindJavaVM(jvmpath, jre3, useServerVM);
519502 }
520503 }
@@ -521,7 +504,6 @@
521504 }
522505
523506 lstrcpy(classpath, "-Djava.class.path=");
524- lstrcpy(extdirs, "-Djava.ext.dirs=");
525507 lstrcpy(libpath, "-Djava.library.path=.;");
526508
527509 if(relative_classpath != NULL)
@@ -562,10 +544,22 @@
562544 char* dir = dirs;
563545 while (*dir)
564546 {
547+ char* jars = GetJars(dir);
548+ char* jar = jars;
549+ while(*jar)
550+ {
551+ if(strstr(classpath, jar) == NULL)
552+ {
553+ lstrcat(classpath, ";");
554+ lstrcat(classpath, jar);
555+ }
556+ jar += lstrlen(jar) + 1;
557+ }
558+ HeapFree(GetProcessHeap(), 0, jars);
559+
565560 lstrcat(classpath, ";");
566561 lstrcat(classpath, dir);
567- lstrcat(extdirs, dir);
568- lstrcat(extdirs, ";");
562+
569563 lstrcat(libpath, dir);
570564 lstrcat(libpath, ";");
571565 AddPath(dir);
@@ -579,7 +573,6 @@
579573 HeapFree(GetProcessHeap(), 0, buf_extdirs);
580574 HeapFree(GetProcessHeap(), 0, extdir);
581575 }
582- lstrcat(extdirs, extpath);
583576
584577 if(GetEnvironmentVariable("PATH", buffer, 64 * 1024))
585578 {
@@ -810,6 +803,72 @@
810803 return buf;
811804 }
812805
806+char* GetJars(char* dir)
807+{
808+ int size = lstrlen(dir) + 2;
809+ char* buf;
810+
811+ AddJars(NULL, dir, &size);
812+ buf = (char*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size);
813+ AddJars(buf, dir, NULL);
814+ return buf;
815+}
816+
817+char* AddJars(char* buf, char* dir, int* size)
818+{
819+ WIN32_FIND_DATA fd;
820+ HANDLE hSearch;
821+ char search[MAX_PATH];
822+ char child[MAX_PATH];
823+ lstrcpy(search, dir);
824+ lstrcat(search, "\\*");
825+
826+ hSearch = FindFirstFile(search, &fd);
827+ if (hSearch != INVALID_HANDLE_VALUE)
828+ {
829+ do
830+ {
831+ if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
832+ {
833+ if (lstrcmp(fd.cFileName, ".") == 0 || lstrcmp(fd.cFileName, "..") == 0)
834+ {
835+ continue;
836+ }
837+
838+ lstrcpy(child, dir);
839+ lstrcat(child, "\\");
840+ lstrcat(child, fd.cFileName);
841+ buf = AddJars(buf, child, size);
842+ }
843+ else
844+ {
845+ int len = lstrlen(fd.cFileName);
846+ if(len >= 4)
847+ {
848+ char* ext = fd.cFileName + len - 4;
849+ if(lstrcmpi(ext, ".JAR") == 0)
850+ {
851+ lstrcpy(child, dir);
852+ lstrcat(child, "\\");
853+ lstrcat(child, fd.cFileName);
854+ if (size != NULL)
855+ {
856+ *size = *size + lstrlen(child) + 1;
857+ }
858+ if(buf != NULL)
859+ {
860+ lstrcpy(buf, child);
861+ buf += lstrlen(child) + 1;
862+ }
863+ }
864+ }
865+ }
866+ } while (FindNextFile(hSearch, &fd));
867+ FindClose(hSearch);
868+ }
869+ return buf;
870+}
871+
813872 char** GetArgsOpt(char* vm_args_opt, int* argc)
814873 {
815874 LPWSTR lpCmdLineW;
--- exewrap/trunk/exewrap/src/java/exewrap/core/ExewrapClassLoader.java (revision 37)
+++ exewrap/trunk/exewrap/src/java/exewrap/core/ExewrapClassLoader.java (revision 38)
@@ -72,10 +72,6 @@
7272
7373 public void register() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
7474 Thread.currentThread().setContextClassLoader(this);
75-
76- Field scl = ClassLoader.class.getDeclaredField("scl");
77- scl.setAccessible(true);
78- scl.set(null, this);
7975 }
8076
8177 public void loadUtilities(String utilities) throws ClassNotFoundException {
--- exewrap/trunk/exewrap/src/exewrap.c (revision 37)
+++ exewrap/trunk/exewrap/src/exewrap.c (revision 38)
@@ -85,7 +85,7 @@
8585
8686 is_trace_version = strstr(exe_file, "trace") != NULL;
8787
88- printf("exewrap 1.1.8 for %s (%d-bit) %s\r\n"
88+ printf("exewrap 1.1.9 for %s (%d-bit) %s\r\n"
8989 "Native executable java application wrapper.\r\n"
9090 "Copyright (C) 2005-2017 HIRUKAWA Ryo. All rights reserved.\r\n"
9191 "\r\n"
@@ -588,9 +588,9 @@
588588
589589 static DWORD get_version_revision(char* filename)
590590 {
591- /* GetFileVersionInfoSize, GetFileVersionInfo を使うと内部で LoadLibrary が使用されるらしく
592- * その後のリソース書き込みがうまくいかなくなるようです。なので、自力で EXEファイルから
593- * リビジョンナンバーを取り出すように変更しました。
591+ /* GetFileVersionInfoSize, GetFileVersionInfo ?ス?ス?スg?ス?ス?スニ難ソス?ス?ス?ス?ス LoadLibrary ?ス?ス?スg?スp?ス?ス?ス?ス?ス轤オ?ス?ス
592+ * ?ス?ス?スフ鯉ソスフ?ソス?ス\?ス[?スX?ス?ス?ス?ス?ス?ス?スンゑソス?ス?ス?スワゑソス?ス?ス?ス?ス?スネゑソス?スネゑソス謔、?スナゑソス?スB?スネので、?ス?ス?スヘゑソス EXE?スt?ス@?スC?ス?ス?ス?ス?ス?ス
593+ * ?ス?ス?スr?スW?ス?ス?ス?ス?スi?ス?ス?スo?ス[?ス?ス?ス?ス?スo?ス?ス?ス謔、?スノ変更?ス?ス?スワゑソス?ス?ス?スB
594594 */
595595 DWORD revision = 0;
596596 HANDLE hFile;
@@ -760,7 +760,7 @@
760760
761761 *(DWORD*)buf = version;
762762
763- //1.7〜
763+ //1.7?ス`
764764 if (major == 1 && minor >= 7 && build == 0)
765765 {
766766 if(revision == 0)
@@ -1056,7 +1056,7 @@
10561056 product_version_build = atoi(strtok(NULL, "."));
10571057 product_version_revision = atoi(strtok(NULL, "."));
10581058
1059- // revison が明示的に指定されていなかった場合、既存ファイルから取得した値に 1 を加算して revision とする。
1059+ // revison ?ス?ス?ス?ス?ス?ス?スI?スノ指?ス閧ウ?ス?ストゑソス?スネゑソス?ス?ス?ス?ス?ス鼾?ソスA?ス?ス?ス?ス?スt?ス@?スC?ス?ス?ス?ス?ス?ス謫セ?ス?ス?ス?ス?スl?ス?ス 1?ス@?ス?ス?ス?ス?スZ?ス?ス?ス?ス revision ?スニゑソス?ス?スB
10601060 strcpy(buffer, version_number);
10611061 if (strtok(buffer, ".") != NULL)
10621062 {
@@ -1073,7 +1073,7 @@
10731073 }
10741074
10751075 file_version_revision = (short)previous_revision + 1;
1076- // build 加算判定ここまで。
1076+ // build ?ス?ス?スZ?ス?ス?ス閧ア?ス?ス?スワで。
10771077 sprintf(file_version, "%d.%d.%d.%d", file_version_major, file_version_minor, file_version_build, file_version_revision);
10781078
10791079 GetResource("VERSION_INFO", &res);
Show on old repository browser