Deployment, SysAdmin

Instalando Jetty Plus no Lucid Lynx

Há alguns dias precisei instalar o Jetty com a extensão Jetty-Plus em um Ubuntu 10.04 (Lucid Lynx). Resolvi usar o apt-get. Instalar o Jetty foi muito fácil. Mas na hora de instalar o Jetty-Plus deu um trabalhinho…

Mas por que eu precisei do Jetty-Plus? É que o Jetty-Plus facilitada o acesso a vários recursos do Java, entre eles JNDI.

No pacote do Jetty para o Ubuntu, o Jetty-Plus não é instalado. Pensei que bastasse instalar o pacote recomendado libjetty-extra, mas precisei fazer algumas outras alterações.

A partir da versão 10.10 (Maverick Meerkat), o pacote libjetty-extra já com os jars e as configurações do Jetty-Plus.

Instalando o Jetty com o apt-get

Para instalar o Jetty no Ubuntu (ou Debian) é fácil:

sudo apt-get install jetty

Para executar o Jetty recém instalado com sucesso, é preciso editar o arquivo /etc/default/jetty e modificar a primeira linha para:

NO_START=0 # change to 0 to allow Jetty to start

Então, basta executar:

sudo /etc/init.d/jetty start

Ou mais fácil:

sudo service jetty start

Instalando o Jetty-Plus no Lucid Lynx

Para instalar o Jetty-Plus no Lucid Lynx, precisamos primeiramente instalar o pacote libjetty-extra para que sejam instalados os jars de naming, entre outras coisas. Sem os pacotes de naming, não é possével usar os recursos de JNDI do Jetty-Plus.

apt-get install libjetty-extra

Além disso, é preciso baixar o jar do Jetty-Plus na mão. A versão do Jetty usada pelo Lucid Lynx é a 6.1.22. Depois de feito o download do jetty-plus.jar da versão 6.1.22, é preciso colocá-lo em /usr/share/java, criando um link simbólico para o arquivo em /usr/share/jetty/lib. Dessa maneira, as convenções usadas pelo pacote são seguidas.

sudo ln --symbolic /usr/share/java/jetty-plus.jar /usr/share/jetty/lib

É interessante criar uma pasta webapps-plus em /var/lib/jetty/ para que possamos colocar os WAR’s que utilizam JNDI e os outros recursos do Jetty-Plus. Tambem é bom criar um link simbólico dessa pasta para /usr/share/jetty.

sudo ln --symbolic /var/lib/jetty /usr/share/jetty

Então, é preciso criar um arquivo jetty-plus.xml e colocar as configuracões de JNDI ou EnvEntry. A propriedade webappdir deve apontar para o diretório webapp-plus criado.

Para habilitar a leitura do jetty-plus ao inicar o Jetty, é necessário editar o arquivo /usr/share/jetty/etc/jetty.conf e inserir “jetty-plus.xml” na última linha.

Então, basta iniciar o serviço do Jetty e suas aplicações poderão usar recursos de JNDI.

sudo service jetty start

Anúncios
JUnit, Testes

JUnit 4 e arquivos

Testar código que manipula arquivos com o JUnit em geral é muito chato. Os testes ficam cheios de código que usa a API de io do Java e que deixa de expressar o comportamento do código.

A classe TemporaryFolder do JUnit 4.7 tem uma API para criar arquivos e diretórios dentro de um diretório temporário. Essa classe usa o mecanismo de @Rule do JUnit 4 apagar arquivos depois de cada teste (depois até do @After do teste atual).

public class FileUploaderTest {
	
    @Rule
    public TemporaryFolder folder = new TemporaryFolder();

	private static final String INPUT_FILENAME = "input.ext";
	private static final String OUTPUT_FILENAME = "output.ext";
	
	private FileUploader fileUploader;
	private File inputFile;
	private File outputDir;

	@Before
	public void setUp(){
		outputDir = folder.newFolder("outputDir");
		fileUploader = new FileUploader(outputDir);
		inputFile = new File(INPUT_FILENAME);
	}

	@Test
	public void shouldWriteTheUploadedFile() throws IOException{
		inputFile = folder.newFile(INPUT_FILENAME);

		fileUploader.upload(inputFile, OUTPUT_FILENAME);
		
		File outputFile = new File(outputDir, OUTPUT_FILENAME);
		assertTrue(outputFile.exists());
	}

	@Test(expected=FileUploadException.class)
	public void inputFileShouldNotBeADirectory(){
		inputFile = folder.newFolder(INPUT_FILENAME);
		fileUploader.upload(inputFile, OUTPUT_FILENAME);
	}
}