Erro ao trabalhar com JAR EXECUTAVEL

2 respostas
Thiago_MuiLoko

Bom galera... é o seguinte:

Tenho uma aplicação que funciona com apenas 2 classes. Sendo que a MANAGER é a principal.
O funcionamento ocorre normalmente, porém estou tentando encapsular em um JAR EXECUTAVEL.

Ao adicionar no JAR não consigo fazê-lo funcionar... Ao realizar o duplo-clique simplismente não acontece nada e quando tento via linha de comando retorna a seguinte mensagem:

[color=red]G:\JAVA\Project>java -jar Manager.jar
Failed to load Main-Class manifest attribute from
Manager.jar[/color]

Os arquivos estão em uma pasta chamada Final... no jar eu devo colocar "Final.classe" ou apenas "classe"

Seguem os códigos utilizados sendo que o primeiro é o conteúdo do JAR, e os itens ICON.JPG e TEXT.TXT são internos ao JAR.

Manifest-Version: 1.0
Created-By: Thiago Campos, Equipe TI 
Main-Class: Manager
public class Manager 
{   
  public static void main(String args[]) throws Exception
  {   
    //Configura o programa para rodar em modo "tray"
    final SystemTray tray = SystemTray.getSystemTray();   
  	
  	//Busca a imagem a ser utilizada no icone
    Image image = Toolkit.getDefaultToolkit().getImage("icon.jpg");   
    
    //Cria um PopupMenu para armazenar os itens dentro do menu do TrayIcon
    PopupMenu popup = new PopupMenu();
    
    //Cria os itens do menu
    MenuItem itemAbout = new MenuItem("Autor");   

  	//Seta o TrayIcon com 3 parametros:
  	// - Icone;
  	// - String que aparece com o passar do mouse;
  	// - Itens do popup.
  	final TrayIcon trayIcon = new TrayIcon(image, "Manager", popup);   
    trayIcon.setImageAutoSize(true);
    
    //Configuração do Bloqueio
   	final LockScreen block = new LockScreen();
	block.setHoraBlock();

	//Listener para exibir msg com dois clicks do mouse, menu ira aparecer com botao direito
    ActionListener clickListener = new ActionListener() 
    {   
        public void actionPerformed(ActionEvent cl) 
        {   
        	//If apenas para evitar erros        	
    		if (SystemTray.isSupported() == true) 
    		{
    			//Seta a imagem automaticamente   
			    trayIcon.setImageAutoSize(true);
			    //Mostra a mensagem com 3 argumentos: Titulo, texto e icone info,    
			    trayIcon.displayMessage("Manager: ",    
			    	"Versão 1.0", TrayIcon.MessageType.INFO);   
     			return;   
        	}    
    	}    
     };     
    
  	//Listener de configuração do item autor
 	ActionListener autorListener = new ActionListener() 
 	{   
	    public void actionPerformed(ActionEvent au) 
	    {   
	    	//Seta a imagem automaticamente  
	    	trayIcon.setImageAutoSize(true); 
	    	//Mostra a mensagem com 3 argumentos: Titulo, texto (2 linhas) e icone info,      
	    	trayIcon.displayMessage("Autor", 
	    		"Thiago Campos\nTI", TrayIcon.MessageType.INFO);   
    	}   
    };   

	//Listener para remover o ícone e fechar o sistema:   
    ActionListener actionListener = new ActionListener() 
    {   
    	public void actionPerformed(ActionEvent e) 
    	{   
   			if (SystemTray.isSupported() == false) 
   			{   
    			trayIcon.setImageAutoSize(true);   
    			//Remove o trayIcon
    			tray.remove(trayIcon);   
    			return;   
    		}  
		} 
	};  
  
	//Adicionando os Listeners nos itens de menu criados anteriormente
	itemAbout.addActionListener(autorListener);
     	
    //Adiciona os Listeners que executam ações no trayIcon
    trayIcon.addActionListener(actionListener);   
    trayIcon.addActionListener(clickListener);  
//    trayIcon.addActionListener(blockListener); 
  
	//Adiciona os itens no menu PopUp	
    popup.add(itemAbout);   
  	
  	//Realiza o try exception
    try 
    {   
    	tray.add(trayIcon);   
    } catch (AWTException ex) 
    {   
    	JOptionPane.showMessageDialog(null, ex);   
    }
    
    //realizando o bloqueio
	int progress = 0;
	while(progress != 1)
	{
		block.Lock();
		if (block.msgAviso())
			{
				trayIcon.setImageAutoSize(true);
				trayIcon.displayMessage("Aviso: ",    
				    	"Seu computador será bloqueado em poucos minutos.\nSalve seus trabalhos", 
				    	TrayIcon.MessageType.INFO);				
			}
 	}
    }   
       
}
import  java.io.*;  
import java.util.*; 
  
public class LockScreen 
{
	String[] 		ids;
	SimpleTimeZone 	pdt;
	Calendar 		calendar;
	Date 			trialTime;
	int 			hora;
	File 			arquivo;
	FileReader 		leitor;
	BufferedReader 	buf;
	String 			linha, texto;
	   
    public void setHoraBlock() throws IOException
    {
    	//Informa o programa qual arquivo será utilizado
		arquivo = new File("text.txt");
		//Configura o leitor do arquivo
		leitor = new FileReader(arquivo);
		//Armazena a leitura no buffer para a utilização
		buf = new BufferedReader(leitor);
		
		linha = "";
		texto = "";
		
		//Enquanto a linha lida não for nula (vazia)
		while(linha!=null)
		{
			//adiciona a linha lida 
			texto = texto + linha;
			//Armazena na variavel a informação lida da linha do arquivo 
			linha=buf.readLine();
		}
		//Seta a variavel global com a hora 
		hora = Integer.parseInt(texto);
    }
    
    public int getHoraBlock()
    {
    	return hora;
    }
        
    public boolean msgAviso()
    {
    	if ((calendar.get(Calendar.HOUR_OF_DAY) == getHoraBlock() - 1) && (calendar.get(Calendar.MINUTE) >= 45))
    		{
    			return true;
    		}
    	
    	return false;
    }
    
    public void Lock()
    {
    	//Forma o suporte para o fuso horario brasileiro (GMT: -3:00)
		ids = TimeZone.getAvailableIDs(-3 * 60 * 60 * 1000);
		
		//Verifica se Indice De Seguranca foi preenchido corretamente pelo sistema, 
		//caso contrario ira sair do programa		
		if (ids.length == 0)
		     System.exit(0);    	
    	
    	//Inicia o controle da hora e seta o GMT pra nao ter falhas de configuracoes do Windows
    	pdt = new SimpleTimeZone(-3 * 60 * 60 * 1000, ids[0]);
    	
    	//Inicia o calendario com base nas informacoes setadas acima
    	calendar = new GregorianCalendar(pdt);
    	
    	//Cria um objeto DATE para utilizar a hora corrente no sistema operacional
		trialTime = new Date();
		calendar.setTime(trialTime);
		
		//Caso a hora do sistema seja igual a hora informada pelo usuario     
    	if ((calendar.get(Calendar.HOUR_OF_DAY) == (getHoraBlock() - 1)) && (calendar.get(Calendar.MINUTE) == 50))
			{
				try 
				{
				   	
					String ls_str;   
			  		//Bloqueia a tela
			  		Process ls_proc = Runtime.getRuntime().exec("rundll32 user32,LockWorkStation");   
			  		
			  		//Faz com que o Java reconheca o comando do Windows
			        BufferedReader ls_in = new BufferedReader(new InputStreamReader   
			                                          (ls_proc.getInputStream()));   
			        try 
			        {   
			        	while ((ls_str = ls_in.readLine()) != null) 
			        	{   
			            	System.out.println(ls_str);   
			        	}   
			        } catch (IOException e) 
			        {   
			        	System.exit(0);   
			        }   
			    } catch (IOException e1) 
			    {   
			        System.err.println(e1);   
			        System.exit(1);   
			    }   
  			}
    	//System.exit(0);   
    }   
}

Agradeço atencipadamente a atenção de todos!

2 Respostas

Thiago_MuiLoko

UP!

Thiago_MuiLoko

Galera… consegui resolver o problema…

Pra quem tiver o mesmo problema, segue a solução:

BASTA ALTERAR O “Main-Class” de posição pois, segundo a especificação, o Main-Class deve ter uma linha abaixo dele (em branco ou não) e quando eu salvei o editor estava excluindo as linhas abaixo (acho)… Segue o .jar

Manifest-Version: 1.0 Main-Class: Manager Created-By: Thiago Campos, Equipe TI

Criado 4 de agosto de 2009
Ultima resposta 5 de ago. de 2009
Respostas 2
Participantes 1