我遇到一个问题,当我在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的建议,通过切换到NSIS的ANSI版本解决了问题。
我想在pom.xml中转义一个属性.不是在资源中,我知道可以使用过滤器.例如,我尝试使用launch4j插件,如下所示:
<plugin>
<groupId>org.bluestemsoftware.open.maven.plugin</groupId>
<artifactId>launch4j-plugin</artifactId>
<executions>
<execution>
<id>l4j-cli</id>
<phase>install</phase>
<goals>
<goal>launch4j</goal>
</goals>
<configuration>
<headerType>console</headerType>
<outfile>../out.exe</outfile>
<dontWrapJar>true</dontWrapJar>
<jar>./../out.jar</jar>
<icon>../icon.ico</icon>
<chdir>.</chdir>
<customProcName>true</customProcName>
<downloadUrl>http://www.oracle.com/technetwork/java/javase/downloads/index.html</downloadUrl>
<classPath>
<mainClass>com.stack.Main</mainClass>
<addDependencies>true</addDependencies>
<jarLocation>./lib</jarLocation>
</classPath>
<jre>
<opts>
<opt>-DconfigBasePath=${ALLUSERSPROFILE}/dir</opt>
</opts>
</jre>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
并且$ {ALLUSERSPROFILE}不能由maven解释,而是由launch4j生成的程序.我尝试:
\${ALLUSERSPROFILE}
\\${ALLUSERSPROFILE}
$${ALLUSERSPROFILE}
Run Code Online (Sandbox Code Playgroud)
和
<properties>
<dollar>$</dollar>
</properties>
${dollar}{ALLUSERSPROFILE}
Run Code Online (Sandbox Code Playgroud)
但没什么用.
我已经使用Java一段时间了,足够长的时间来开始用GUI创建我自己的程序,而不仅仅是在Eclipse中运行的教科书中的一些示例程序.我希望通过将可执行文件Jar包装到Exe中,使我的程序对用户,特别是Windows用户更加友好.所以我找到了Launch4j,它似乎做得非常好,但我不知道该程序中超过一半的选项意味着什么(我花了一个小时来弄清楚如何让它来制作一个功能性的Exe).我把它递给了一个油炸试验,他回到我身边说他没有发现JRE错误.好吧,我想知道如何强制最终用户拥有JRE然后我注意到Launch4j中的捆绑JRE选项.但是我该如何使用它?我是否下载了Windows的JRE脱机安装程序,如果找不到已安装的安装程序,它将运行吗?那么系统的正确版本(32位v 64位)怎么样?我想我以为我会把它带到这个包含JRE的神秘软件包中,我的包装程序会用它来运行.只是有人可以请告诉我如何使用该功能,如果我需要下载什么,等等.
如果Launch4j不是最好的程序,那么请推荐别的东西,我刚刚开始进入这个,因为我知道有更好的包装.
我正在尝试使用launch4j将JRE捆绑到我的exe中.
我的文件夹结构如下 -
|- test
|- jre(copied from my windows installation of jre)
|-bin
|-lib
|- jretest.jar (the jar file I am using to create my exe)
|- jretest.exe (the output exe file)
Run Code Online (Sandbox Code Playgroud)
在Launch4j中,我设置了Bundled JRE Pathas jre.
到目前为止exe工作正常.
但是,当我将我的exe文件复制到别处并运行它时,我收到错误消息This application was configured to use a bundled Java Runtime Environment but the runtime is missing or corrupted.
我搜索了SO并发现了以下问题,但无法让我的应用程序使用那里给出的建议.
如何将JRE捆绑到Java应用程序的EXE中?Launch4j说"运行时丢失或损坏."
知道这里捆绑的jre会出现什么问题吗?
我怎样才能创建一个独立的exe?
我不想为我的应用程序制作安装程序,只是打算运行它.
任何帮助将不胜感激.
我正在开发Java应用程序,主要是GUI应用程序。但是,它也提供了命令行界面。我可以将命令行参数分为三种不同的类型:
当我使用执行应用程序时java -jar <application-name>.jar -parameter,一切都会按预期进行。应用程序执行要求执行的操作。在应用程序关闭或完成后,shell提示返回。
问题
当我使用launch4j从jar文件创建Windows包装器时,此行为会更改。shell提示总是立即返回。因此,我仍然可以传递命令行参数,但是无法通过终端与应用程序进行交互。它不打印任何写到stdout或stderr的内容,也不能从stdin读取任何内容。
题
如何配置launch4j创建一个exe包装器,该包装器提供与包装后的jar文件相同的命令行行为?
附加信息
我将launch4j maven插件用于以下配置:
<plugin>
<groupId>com.akathist.maven.plugins.launch4j</groupId>
<artifactId>launch4j-maven-plugin</artifactId>
<version>1.7.8</version>
<executions>
<execution>
<id>launch4j</id>
<phase>package</phase>
<goals>
<goal>launch4j</goal>
</goals>
<configuration>
<headerType>gui</headerType>
<stayAlive>true</stayAlive>
<outfile>path/to/outfile.exe</outfile>
<jar>path/to/infile.jar</jar>
<dontWrapJar>false</dontWrapJar>
<errTitle>Error in Launcher</errTitle>
<classPath>
<mainClass>com.example.Launch</mainClass>
<addDependencies>false</addDependencies>
</classPath>
<icon>path/to/icon.ico</icon>
<jre>
<minVersion>1.8.0</minVersion>
<initialHeapSize>512</initialHeapSize>
<maxHeapSize>1024</maxHeapSize>
</jre>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
launch4j的文档说,设置的给定组合headerType=gui和 stayAlive=true将等待应用程序关闭,情况并非如此。
由于我没有Windows机器,因此我无法尝试设置时发生的情况headerType=console。文档说,这会使包装程序始终等待并返回应用程序的退出代码。但是,由于我的应用程序主要是GUI应用程序,所以我想知道此设置是否有负面影响。在这一点上,我开始问自己,为什么我希望包装的应用程序具有不同于jar文件的其他命令行行为。
请注意:我在这里创建了这个 GitHub 项目,可以用来完美地重现我所看到的问题。
Java 8尝试通过gradle-launch4j Gradle 插件使用Launch4J来构建 Windows 本机 EXE 应用程序。我正在 Mac 上开发 Java Swing 应用程序,但该应用程序必须在 Windows 10 上作为 Windows EXE 运行。我还使用 ShadowJar 构建我的独立“胖罐子”。
我可以构建我的(Swing)应用程序的 fat jar,然后通过java -jar build/lib/myapp.jar. 启动和运行都没有问题。
这是我的 Launch4J Gradle 配置:
launch4j {
mainClassName = 'com.example.windows.hello.HelloWindowsApp'
icon = "${projectDir}/icon.ico"
jdkPreference = 'jdkOnly'
initialHeapSize = 128
jreMinVersion = '1.8.0'
jreMaxVersion = '1.8.9'
maxHeapSize = 512
stayAlive = false
bundledJre64Bit = true
bundledJrePath = '../hello-windows/jre8'
}
Run Code Online (Sandbox Code Playgroud)
当我运行时./gradle clean build …
我在尝试创建.exe文件来运行 JavaFX 应用程序时遇到了一些困惑。
在 Eclipse 中我使用 VM 参数:
--module-path "\path\to\javafx-sdk-14.0.1\lib" --add-modules javafx.controls,javafx.fxml
Run Code Online (Sandbox Code Playgroud)
但我不确定如何添加它Launch4j才能运行它。有人可以告诉我如何添加它吗?
我发现我们正在使用的遗留软件,其启动属性格式错误,因此它接收这两个不相等的xmx作为属性:
java -jar myapp.jar -Xmx128m -Xmx512m
Run Code Online (Sandbox Code Playgroud)
我无法访问启动器源代码(无法修改它),所以我问,这些参数的重复有什么影响?我可以这样离开吗,还是我应该担心?哪一个将适用?
使用的JVM是JRE 6更新18
我是launch4j的新手.我想用launch4j创建exe文件.我已经关注了lauch4j教程的这个链接.现在,我想使用launch4j在命令行中创建exe文件?我尝试过以下命令,但它不起作用.
>launch4j.exe sample.jar
Run Code Online (Sandbox Code Playgroud) 我能够从可执行jar创建一个.exe文件.从Launch4j我可以测试包装器,日志上的输出是我所期望的.但是,如果我尝试从命令行或从Windows资源管理器运行exe,则不会发生任何事情.没有错误,没有按预期输出到控制台.该程序也应该编辑一个文本文件,当我使用批处理文件运行jar时会发生这种情况,但是当我运行exe时却不会.这都是在同一台计算机上,所以我怀疑它是JRE的一个问题.我已经广泛搜索了StackOverflow,但没有发现任何有助于这种情况.我确实发现这个帖子有类似的问题:Launch4J可执行文件没有按预期执行但没有人真正回答了这个问题.提前谢谢你的帮助