JavaExe和Java应用程序作为windows系统服务交互到桌面
请求:
这是我的语言环境中Java开发人员面临的一个非常常见的问题。 我真的被困了很多天。 搜索并尝试了很多,阅读文档。 阅读所有与JavaExe相关的stackoverflow问题。 如果您以前做过类似的事情并且有一个全面的答案,请回复。 我真的很感谢社区!
塞纳里奥:
我正在使用JavaExe在桌面交互function中将应用程序作为系统服务运行。 确切地说,我有一个应用程序, 可以捕获桌面的屏幕截图 。 我想让它在任何用户登录时运行( 作为管理员 ),所以没有人可以阻止它。
我有一个myapp.jar,settings.txt和一个lib目录。
我搜索了很多,发现JavaExe工作(看它的例子)
如果有人有更好的方法。 请说明。
问题:
根据我的研究,
-
您必须创建一个名为.exe的.properties文件,并在此文件中写入
"RunType = 1"
。 -
你在主类中定义一个静态方法:
serviceInit()
我需要放置任何类或引用/导入吗? 怎么样?
编辑:
我下面的代码也可以作为独立的.jar和javaExe.exe使用 。
它现在确实提供系统服务并由SYSTEM用户运行。 但它不是桌面互动 。 即它没有显示任何GUI。
package temp; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JOptionPane; public class Temp { /** * @param args the command line arguments */ public static void main(String[] args) { serviceInit(); } public static boolean serviceInit(){ new Thread(){ public void run(){ Integer i = 0; while(i < 999999999){ JOptionPane.showMessageDialog(null,i); i++; } } }.start(); return true; } }
我不认为将.jar,lib目录和settings.txt捆绑成一个.exe是可能的吗?
你应该在你的情况下:
public class MyApp_ServiceManagement { static boolean isMsgToDisplay = false; ///////////////////////////// public static boolean serviceInit() { (new Thread() { public void run() { for(int i=0;i < 6;i++) { try { sleep(5*1000); } catch(Exception ex) {} isMsgToDisplay = true; } } }).start(); return true; } /// is Data ready to be send to the UI ? public static boolean serviceIsDataForUI() { return isMsgToDisplay; } /// Data to be send to the UI public static Serializable serviceDataForUI() { isMsgToDisplay = false; return "hello, I am an interactive Service"; } }
对于UI部分:
public class MyApp_TaskbarManagement { /// To show (or not) the icon in tray public static boolean taskIsShow() { return false; } /// Receive the message from Service public static void taskDataFromService(Serializable data) { JOptionPane.showMessageDialog(null, data); } /// descr of UI public static String[] taskGetInfo() { return new String[] { "UI part of Service" }; } }
main()方法永远不会在服务模式下调用(除了一个特殊情况),但如果你想保留你的main()方法,你必须在serviceInit()中调用main()。
将serviceInit()放在主类或名为XXX_ServiceManagement的另一个类中,其中XXX是主类的名称。
然后,serviceInit()必须在30秒延迟之前返回。 不要把无限循环……放在里面。 将您的代码放在一个线程中,并从serviceInit()(或main)启动它
那个答案你的问题?