请求:
这是我的语言环境中Java开发人员面临的一个非常常见的问题。我真的被困了很多天。搜索并尝试了很多,阅读文档。阅读所有与JavaExe相关的stackoverflow问题。如果您以前做过类似的事情并且有一个全面的答案,请回复。我真的很感谢社区!
塞纳里奥:
我正在使用 JavaExe 在桌面交互式功能中将应用程序作为系统服务运行。 确切地说,我有一个捕获桌面截图的应用程序。我希望它在任何用户登录上运行(作为管理员),因此没有人可以阻止它。
我有一个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是可能的吗?
答案 0 :(得分:2)
你应该在你的情况下:
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"
};
}
}
答案 1 :(得分:1)
main()方法永远不会在服务模式下调用(除了一个特殊情况),但如果你想保留你的main()方法,你必须在serviceInit()中调用main()。
将serviceInit()放在主类或名为XXX_ServiceManagement的另一个类中,其中XXX是主类的名称。
然后,serviceInit()必须在30秒延迟之前返回。 不要把无限循环......放在里面。 将代码放在一个线程中,然后从serviceInit()(或main)
启动它你问题的答案?