相关疑难解决方法(0)

在Windows 7上启动Java应用程序的最佳方法是什么?

要求

我想在Windows 7上发布Java GUI应用程序.此应用程序使用Swing Toolkit,不需要任何本机代码.使用NSIS安装程序安装该应用程序.我想尽可能地将此应用程序集成到Windows 7中.这意味着:

  • 当应用程序运行时,必须可以将应用程序固定到任务栏.
  • 必须可以将数据文件与应用程序相关联,以便Windows使用我的应用程序打开这些文件.
  • 必须自动使用32位Java运行时和64位Java运行时.因此,当用户卸载32位Java并安装64位Java时(反之亦然),那么我的应用程序仍然可以工作.
  • 必须支持Windows的大字体设置.我真的不明白这个功能.我只知道有些应用程序完全忽略它,其他应用程序(如谷歌浏览器)是像素缩放的(看起来真的很难看)而其他人只是按照预期使用更大的字体来支持它(这就是我想要的,通常它的工作原理.只有WinRun4J解决方案下面提到的不起作用).

测试解决方案

WinRun4J

WinRun4j是一个启动Java应用程序的EXE文件.因为应用程序没有分叉新的Java进程,Windows认为EXE文件是应用程序.所以任务栏没有问题.文件关联有效,因为文件可以简单地与EXE文件关联.

问题:

  • 不支持大字体.应用程序窗口是像素缩放的(与谷歌浏览器一样).
  • 必须使用两个不同的EXE文件,具体取决于安装的JRE.因此,当安装64位JRE时,必须使用64位EXE文件启动应用程序.当安装32位JRE时,必须使用另一个EXE.这不是用户友好的,因为当仅安装32位JRE时,用户不理解为什么他必须在64位操作系统上使用32位EXE.

Launch4J

Launch4J创建了一个32位EXE,它启动了一个外部Java进程来启动Java应用程序.因此,与WinRun4J不同,它也可以启动64位Java.

问题:

  • 无法将应用程序固定到任务栏.
  • System.out.printlnheaderType="gui"无论是否从控制台启动应用程序,都不会打印到控制台.

在Windows上,您只需双击JAR文件即可启动该应用程序.安装JRE并不重要,只是工作.但...

问题:

  • 应用程序无法固定到任务栏.
  • 无法在开始菜单中创建快捷方式.
  • 无法将文件与JAR文件关联.

BAT/CMD

像这样的简单批处理文件可用于启动应用程序:

@echo off
start c:\windows\system32\javaw.exe -jar "c:\program files\myapp\myapp.jar" %1
Run Code Online (Sandbox Code Playgroud)

可以为此批处理文件创建快捷方式以设置自定义图标.

问题:

  • 启动应用程序时会弹出DOS窗口.
  • 批处理文件不知道javaw.exe的位置.根据安装的Java版本(32位或64位),它可能位于其中c:\windows\syswow64,Windows不会自动从批处理文件重定向此调用.使用JAVA_HOME环境变量也是不可取的,因为Java不会自动设置它.
  • 将文件与批处理文件关联时,不能设置自定义图标.
  • 任务栏支持无法正常工作.当手动启动批处理文件时,可以将应用程序固定到它,但是当双击相关文件时它不起作用.

捷径

可以仅创建启动应用程序的快捷方式,而不是使用批处理文件.它链接到这个命令:c:\windows\system32\javaw.exe -jar "c:\program files\myapp\myapp.jar".如果安装了32位Java JRE,Windows会自动将此调用重定向到SysWOW64目录.

问题:

  • 无法将文件与其关联,因为Windows仅接受EXE/COM/PIF/BAT/CMD文件作为关联目标.LNK文件不起作用.

还有另一种解决方案可以满足上述所有要求吗?或者有没有任何技巧来解决上述解决方案的问题?

使用Launch4j解决任务栏固定问题后,看起来是最好的解决方案.Launch4j可以很容易地集成到Maven项目中(使用这个这个插件),配置非常简单,除了任务栏固定外,一切都是开箱即用的.对于任务栏固定,Java应用程序必须按照此问题的答案中的说明设置appModelUserId .

此外,Java应用程序必须由安装程序安装,安装程序必须至少安装一个指向EXE的快捷方式.此快捷方式还必须包含appModelUserId.使用NSIS,可以使用WinShell插件 …

java windows batch-file launch4j winrun4j

36
推荐指数
2
解决办法
2万
查看次数

将Java应用程序固定到Windows 7任务栏

我使用Launch4j作为我在Windows 7下的Java应用程序的包装器,根据我的理解,本质上它的一个实例javaw.exe依次解释Java代码.因此,在尝试将我的应用程序固定到任务栏时,Windows会反而引脚javaw.exe.如果没有所需的命令行,我的应用程序将无法运行.

将Launch4j应用程序固定到任务栏的结果

如您所见,Windows也没有意识到Java是主机应用程序:应用程序本身被描述为"Java(TM)Platform SE binary".

我尝试更改注册表项HKEY_CLASSES_ROOT\Applications\javaw.exe以添加值IsHostApp.这通过完全禁用我的应用程序的固定来改变行为; 显然不是我想要的.

将javaw.exe指定为宿主应用程序的结果

在阅读了Windows如何解释单个应用程序的实例(以及此问题中讨论的现象)之后,我开始对将应用程序用户模型ID(AppUserModelID)嵌入到我的Java应用程序中感兴趣.

我相信我可以通过传递一个独特AppUserModelID的Windows 来解决这个问题.有一种shell32方法,SetCurrentProcessExplicitAppUserModelID.根据Gregory Pakosz的建议,我实现了它,试图将我的应用程序识别为以下单独的实例javaw.exe:

NativeLibrary lib;
try {
    lib = NativeLibrary.getInstance("shell32");
} catch (Error e) {
    Logger.out.error("Could not load Shell32 library.");
    return;
}
Object[] args = { "Vendor.MyJavaApplication" };
String functionName = "SetCurrentProcessExplicitAppUserModelID";
try {
    Function function = lib.getFunction(functionName);
    int ret = function.invokeInt(args);
    if (ret != 0) {
        Logger.out.error(function.getName() + " returned error …
Run Code Online (Sandbox Code Playgroud)

java java-native-interface taskbar launch4j windows-7

35
推荐指数
2
解决办法
2万
查看次数

使用JNA获取/设置应用程序标识符

继续我之前关于Windows 7任务栏的问题,我想诊断为什么Windows不承认我的应用程序是独立的javaw.exe.我目前有以下JNA代码来获取AppUserModelID:

public class AppIdTest {

    public static void main(String[] args) {
        NativeLibrary lib;
        try {
            lib = NativeLibrary.getInstance("shell32");
        } catch (Error e) {
            System.err.println("Could not load Shell32 library.");
            return;
        }
        Object[] functionArgs = new Object[1];
        String functionName = null;
        Function function;
        try {
            functionArgs[0] = new String("Vendor.MyJavaApplication")
                    .getBytes("UTF-16");
            functionName = "GetCurrentProcessExplicitAppUserModelID";
            function = lib.getFunction(functionName);
            // Output the current AppId
            System.out.println("1: " + function.getString(0));
            functionName = "SetCurrentProcessExplicitAppUserModelID";
            function = lib.getFunction(functionName);
            // Set the new …
Run Code Online (Sandbox Code Playgroud)

java utf-16 jna windows-7

21
推荐指数
1
解决办法
6554
查看次数

如何为izpack installer .jar文件制作.exe文件

我用izpack制作安装程序.它在.jar文件中.我想在.exe文件中创建它以便分发它.我怎么能以简单的方式做到这一点?

java installer exe jar izpack

10
推荐指数
2
解决办法
9897
查看次数

使用Launch4j将Java应用程序固定到Windows 7任务栏

我目前正在尝试将Java应用程序固定到Windows 7任务栏.该应用程序是使用Launch4j启动的.程序图标显示正确,但右键单击任务栏上的图标仅显示带有"关闭窗口"条目的上下文菜单.没有用于将应用程序固定到任务栏的菜单项.将EXE文件拖到任务栏也无法正常工作.在任务栏中单击此新启动器时,第二个图标会在任务栏中生成.

我按照这两个问题的解决方案的指示来解决问题,但它没有帮助:

来自第二个问题/解决方案的JNA内容编译并且不会抛出任何异常.我可以在设置后阅读应用程序ID.但我仍然无法将应用程序固定到任务栏.

我在Github上创建了一个小测试应用程序来演示这个问题:

https://github.com/kayahr/launch4jtest

该应用程序使用Maven作为构建系统.只需运行mvn package,您就会在目标目录中找到一个ZIP文件,其中包含设置此应用程序ID所需的EXE文件和jna.jar.将此ZIP解压缩到某个目录,双击EXE并尝试将应用程序固定到任务栏,您将看到问题.

那么这个应用程序有什么问题?

java windows taskbar launch4j windows-7

9
推荐指数
1
解决办法
3087
查看次数

Launch4j,NSIS和重复的固定Windows 7任务栏图标

我遇到一个问题,当我在Windows 7中为应用程序固定任务栏图标时,单击该图标将为该程序打开一个单独的(重复的)图标,而不是将其与用于调用它的快捷方式分组在一起。

应用程序本身是一个.jar文件,已使用Launch4j将其打包为.exe。这就可以解释为什么图标被复制了-Launch4j调用了一个单独的javaw.exe进程,并且当您开始执行此类操作时,AppModelUserID看上去很混乱。

根据这篇文章,解决方案是通过一些本机代码指定AppModelUserID。按照此处给出的示例,我已成功在应用程序中调用了JNA代码,并且看来我已将其正确设置为“ MyCompany.MyApp”形式的值。调用“ get”函数将返回我为其设置的值,因此在应用程序方面一切正常。

...但是那是该解决方案停止的地方!我不认为这是结局,因为它肯定不能解决我的问题!似乎需要的是创建的快捷方式具有相同的 AppModelUserID,这是我对MSDN文档的解释。

由于我使用NSIS作为安装程序,因此我使用WinShell插件在安装时设置应用程序快捷方式的属性。具体来说,该调用反映了以下示例:

WinShell::SetLnkAUMI "$SMPrograms\MyApp\MyApp.lnk" "${MyApp_AppUserModelId}"
Run Code Online (Sandbox Code Playgroud)

那就是我拖到任务栏上的那个……但是同样,没有骰子。该应用程序仍在单独的固定图标中打开。此时,我无法检查是否正确设置了快捷方式属性,因为似乎没有工具可以检查给定快捷方式的AppModelUserID

当我直接创建直接指向.jar文件的快捷方式时,一切正常,但是尝试将JRE安装到NSIS中却遇到了麻烦,而我已经经历了很多尝试,并且要避免这种麻烦。

我非常感谢任何可以帮助我解决这一困扰问题的指南!我总是被这些愚蠢的小美学问题困扰,这些问题可能很难解决...

谢谢!

编辑:在我无法验证快捷方式的AppModelUserID实际上是否正确设置后,按照Anders的建议,通过切换到NSISANSI版本解决了问题。

java taskbar nsis launch4j windows-7

5
推荐指数
1
解决办法
2888
查看次数