<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Diario de Programación &#187; java</title>
	<atom:link href="http://blog.chuidiang.com/tag/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.chuidiang.com</link>
	<description>Programación e informática en general</description>
	<lastBuildDate>Wed, 25 Jan 2012 23:17:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Constantes en los beans y JSTL</title>
		<link>http://blog.chuidiang.com/2012/01/17/constantes-en-los-beans-y-jstl/</link>
		<comments>http://blog.chuidiang.com/2012/01/17/constantes-en-los-beans-y-jstl/#comments</comments>
		<pubDate>Tue, 17 Jan 2012 14:36:21 +0000</pubDate>
		<dc:creator>Chuidiang</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[bean]]></category>
		<category><![CDATA[jstl]]></category>

		<guid isPermaLink="false">http://blog.chuidiang.com/?p=1034</guid>
		<description><![CDATA[A veces, en una aplicaci&#243;n web con JSTL nos vendr&#237;a bien tener una constante definida en uno de los beans de java, estilo public class UnaClase { &#160; &#160;public static final String UNA_CONSTANTE = &#34;algo&#34;; &#160; &#160;&#8230; } y luego poder llamarla desde JSTL con algo como &#60;jsp:useBean id=&#34;bean&#34; class=&#34;com.chuidiang.UnaClase&#34;&#62;&#60;/jsp:useBean&#62; &#8230; &#60;c:out value=&#34;${bean.UNA_CONSTANTE}&#34; /&#62; Desgraciadamente, [...]]]></description>
			<content:encoded><![CDATA[<p>A veces, en una aplicaci&oacute;n web con <a href="http://www.oracle.com/technetwork/java/jstl-137486.html">JSTL</a> nos vendr&iacute;a bien tener una constante definida en uno de los beans de java, estilo</p>
<blockquote>
<p>public class UnaClase {<br />
&nbsp; &nbsp;public static final String UNA_CONSTANTE = &quot;algo&quot;;<br />
&nbsp; &nbsp;&#8230;<br />
}</p>
</blockquote>
<p>y luego poder llamarla desde JSTL con algo como</p>
<blockquote>
<p>&lt;jsp:useBean id=&quot;bean&quot; class=&quot;com.chuidiang.UnaClase&quot;&gt;&lt;/jsp:useBean&gt;<br />
&#8230;<br />
&lt;c:out value=&quot;${bean.UNA_CONSTANTE}&quot; /&gt;</p>
</blockquote>
<p>Desgraciadamente, eso no funciona. JSTL presupone que UNA_CONSTANTE es un atributo del bean y va a convertir ese ${bean.UNA_CONSTANTE} en una llamada al m&eacute;todo bean.getUNA_CONSTANTE() que no existe.</p>
<p>La soluci&oacute;n es f&aacute;cil, basta con crear un m&eacute;todo getUNA_CONSTANTE() en el bean que devuelva el valor de la constante. Unicamente tenemos que tener en cuenta que ese m&eacute;todo no puede ser static, puesto que si no JSTL tampoco lo llamar&aacute; (por debajo, probablemente usa la introspecci&oacute;n de java y no busca m&eacute;todos est&aacute;ticos). El bean quedar&iacute;a as&iacute;</p>
<blockquote>
<p>public class UnaClase {<br />
&nbsp; &nbsp;public static final String UNA_CONSTANTE = &quot;algo&quot;;</p>
<p>&nbsp; &nbsp;public String getUNA_CONSTANTE () {<br />
&nbsp; &nbsp; &nbsp; return UnaClase.UNA_CONSTANTE;<br />
&nbsp; &nbsp;}<br />
&#8230;<br />
}</p>
</blockquote>
<p>que s&iacute; funciona como esperamos.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chuidiang.com/2012/01/17/constantes-en-los-beans-y-jstl/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Abrir conexiones java contra un servidor https</title>
		<link>http://blog.chuidiang.com/2011/11/26/abrir-conexiones-java-contra-un-servidor-https/</link>
		<comments>http://blog.chuidiang.com/2011/11/26/abrir-conexiones-java-contra-un-servidor-https/#comments</comments>
		<pubDate>Sat, 26 Nov 2011 16:22:19 +0000</pubDate>
		<dc:creator>Chuidiang</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[certificados]]></category>
		<category><![CDATA[https]]></category>
		<category><![CDATA[keystore]]></category>

		<guid isPermaLink="false">http://blog.chuidiang.com/?p=1006</guid>
		<description><![CDATA[Me ha tocado abrir conexiones desde c&#243;digo java contra &#160;un servidor https que requiere certificado de cliente. Me he puesto a ello y he aprendido algunas cosas. Cuando hacemos un cliente java contra un servidor https, java verifica que el certificado que presenta ese servidor es v&#225;lido. Por ello, si no los tenemos, necesitamos obtener [...]]]></description>
			<content:encoded><![CDATA[<p>Me ha tocado abrir conexiones desde c&oacute;digo java contra &nbsp;un servidor https que requiere certificado de cliente. Me he puesto a ello y he aprendido algunas cosas.</p>
<p>Cuando hacemos un cliente java contra un servidor https, java verifica que el certificado que presenta ese servidor es v&aacute;lido. Por ello, si no los tenemos, necesitamos obtener dichos certificados y meterlos en un almac&eacute;n de certificados que luego le diremos a java que es el almac&eacute;n de certificados en los que confiamos. Una forma de obtener el certificado es visitar la p&aacute;gina con el navegador y pinchar el el candadito que sale junto a la URL. Ah&iacute; podemos ver los datos del certificado y guardarlo en un fichero.</p>
<p>Con la herramienta keytool que viene con java podemos meter esos certificados en un fichero &uacute;nico, de nombre gen&eacute;rico &quot;KeyStore&quot;. De hecho, el fichero por defecto que crea/usa esta herramienta keytool suele ser $HOME/.keystore. La herramienta keytool nos pedir&aacute; una clave cuando cree el fichero para protegerlo y nos pedir&aacute; la misma clave cada vez que queramos ver, a&ntilde;adir o borrar certificados de ese fichero. El formato de este fichero se conoce como &quot;JKS&quot; y es propio de java.</p>
<p>El certificado de cliente habitualmente nos lo dar&aacute;n como un fichero, protegido por una clave y su formato suele ser &quot;PKCS12&quot;, este es un formato est&aacute;ndar entendido por la mayor&iacute;a de las aplicaciones no java. Su extensi&oacute;n suele ser .p12</p>
<p>Pues bien, en java tenemos dos opciones para indicar cual es nuestro KeyStore y cual es nuestro certificado de cliente. Una es por medio de propiedades de sistema. Podemos arrancar nuestro c&oacute;digo java con propiedades de este estilo</p>
<blockquote>
<p>java -Djavax.net.ssl.trustStore=c:/usuario/.keystore &#8230;.</p>
</blockquote>
<p>y necesitamos hasta 6 de estas propiedades: fichero, clave del fichero y formato del fichero, para el KeyStore y para el certificado del cliente.</p>
<p>Y la otra opci&oacute;n es codificarlo en java directamente, usando clases como SSLContext, TrustStoreFactory, etc, etc. Algo m&aacute;s complejo, pero que nos dar&aacute; m&aacute;s versatilidad si queremos abrir varias conexiones con juegos de certificados distintos.</p>
<p>C&oacute;mo no, todo esto con m&aacute;s detalle en la <a href="http://chuwiki.chuidiang.org/index.php?title=Lectura_http_y_https_desde_java">chuwiki</a>.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chuidiang.com/2011/11/26/abrir-conexiones-java-contra-un-servidor-https/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>jax-ws, metro y cxf</title>
		<link>http://blog.chuidiang.com/2011/09/20/jax-ws-metro-y-cxf/</link>
		<comments>http://blog.chuidiang.com/2011/09/20/jax-ws-metro-y-cxf/#comments</comments>
		<pubDate>Tue, 20 Sep 2011 20:13:26 +0000</pubDate>
		<dc:creator>Chuidiang</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[cxf]]></category>
		<category><![CDATA[jax-ws]]></category>
		<category><![CDATA[metro]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[soap]]></category>
		<category><![CDATA[web services]]></category>

		<guid isPermaLink="false">http://blog.chuidiang.com/?p=977</guid>
		<description><![CDATA[No hace mucho que empec&#233; a trabajar con web services. Buscando, buscando, vi como opciones axis y jax-ws. Al final, por sencillez, me decid&#237; por jax-ws &#8230; pero hoy he descubierto un peque&#241;o detalle que no sab&#237;a. jax-ws no es m&#225;s que una especificaci&#243;n y hay varias posibles implementaciones. Las m&#225;s conocidas son metro y [...]]]></description>
			<content:encoded><![CDATA[<p>No hace mucho que empec&eacute; a trabajar con web services. Buscando, buscando, vi como opciones axis y jax-ws. Al final, por sencillez, me decid&iacute; por jax-ws &#8230; pero hoy he descubierto un peque&ntilde;o detalle que no sab&iacute;a.</p>
<p><a href="http://jcp.org/en/jsr/detail?id=224">jax-ws</a> no es m&aacute;s que una especificaci&oacute;n y hay varias posibles implementaciones. Las m&aacute;s conocidas son <a href="http://metro.java.net/">metro</a> y <a href="http://cxf.apache.org/">cxf</a>. Yo he estado usando metro, confundi&eacute;ndolo con jax-ws. Ahora que he descubierto que hay dos, he investigado un poco en internet a ver ventajas de una y otra. No he hecho pruebas ni una b&uacute;squeda exhaustiva, simplemente comento aqu&iacute; algunas cosas que he visto.</p>
<p>Por un lado, metro obliga a poner las anotaciones sobre clases, mientras que cxf admite que se pongan en interfaces. No es algo demasiado importante, pero siempre es m&aacute;s elegante tener definido el web service sobre una interfaz.</p>
<p>Metro s&oacute;lo soporta <a href="http://es.wikipedia.org/wiki/Simple_Object_Access_Protocol">SOAP</a>, mientras que cxf soporta tambi&eacute;n otros protocolos. De hecho, una misma interfaz puede llevar simult&aacute;neamente anotaciones de SOAP y de <a href="http://es.wikipedia.org/wiki/Representational_State_Transfer">REST</a>, de forma que la clase que lo implementa no necesita saber qu&eacute; tipo de web service habr&aacute; detr&aacute;s.Por su parte, Metro no soporta REST. La implementaci&oacute;n de esta gente para REST est&aacute; en un proyecto separado, <a href="http://jersey.java.net/">Jersey</a>.</p>
<p>Tanto Metro como CXF tienen plugin de maven para generar el WSDL a partir de la clase java o para generar las clases java a partir del WSDL.</p>
<p>Una cosa que he le&iacute;do pero no he acabado de entender es que parece ser que hay diferencias a la hora de tratar/generar c&oacute;digo en los par&aacute;metros de un WebMethod si estos par&aacute;metros tienen cierta complejidad, como ser colecciones. Intentar&eacute; echarle un ojo con m&aacute;s calma a ver.</p>
<div id="-chrome-auto-translate-plugin-dialog" style="opacity: 1 !important; background-image: initial !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: transparent !important; padding-top: 0px !important; padding-right: 0px !important; padding-bottom: 0px !important; padding-left: 0px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 0px !important; position: absolute !important; top: 0px; left: 0px; overflow-x: visible !important; overflow-y: visible !important; z-index: 999999 !important; text-align: left !important; display: none; background-position: initial initial !important; background-repeat: initial initial !important; ">
<div style="max-width: 300px !important;color: #fafafa !important;opacity: 0.8 !important;border-color: #000000 !important;border-width: 0px !important;-webkit-border-radius: 10px !important;background-color: #363636 !important;font-size: 16px !important;padding: 8px !important;overflow: visible !important;background-image: -webkit-gradient(linear, left top, right bottom, color-stop(0%, #000), color-stop(50%, #363636), color-stop(100%, #000));z-index: 999999 !important;text-align: left  !important;">
<div class="translate">&nbsp;</div>
<div class="additional">&nbsp;</div>
</div>
<p><img src="http://www.google.com/uds/css/small-logo.png" onclick="document.location.href='http://translate.google.com/';" style="position: absolute !important; z-index: -1 !important; right: 1px !important; top: -20px !important; cursor: pointer !important;-webkit-border-radius: 20px; background-color: rgba(200, 200, 200, 0.3) !important; padding: 3px 5px 0 !important; margin: 0 !important;" alt="" /></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.chuidiang.com/2011/09/20/jax-ws-metro-y-cxf/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tutorial de java ee</title>
		<link>http://blog.chuidiang.com/2011/05/13/tutorial-de-java-ee/</link>
		<comments>http://blog.chuidiang.com/2011/05/13/tutorial-de-java-ee/#comments</comments>
		<pubDate>Fri, 13 May 2011 16:48:37 +0000</pubDate>
		<dc:creator>Chuidiang</dc:creator>
				<category><![CDATA[JSF]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[java ee]]></category>
		<category><![CDATA[jsf]]></category>

		<guid isPermaLink="false">http://blog.chuidiang.com/?p=927</guid>
		<description><![CDATA[Con el tema de JSF, estoy leyendo poco a poco, en las idas y venidas en tren al trabajo, el tutorial de java ee de sun. No, no te asustes, no me estoy leyendo las mil y pico p&#225;ginas. S&#243;lo el cap&#237;tulo de JSF. Las primeras p&#225;ginas del cap&#237;tulo me parecieron m&#225;s o menos bien. [...]]]></description>
			<content:encoded><![CDATA[<p>Con el tema de JSF, estoy leyendo poco a poco, en las idas y venidas en tren al trabajo, el <a href="http://download.oracle.com/javaee/6/tutorial/doc/">tutorial de java ee</a> de sun. No, no te asustes, no me estoy leyendo las mil y pico p&aacute;ginas. S&oacute;lo el cap&iacute;tulo de JSF.</p>
<p>Las primeras p&aacute;ginas del cap&iacute;tulo me parecieron m&aacute;s o menos bien. No ten&iacute;a ni idea de JSF y leyendo me he ido enterando. Pero seg&uacute;n avanzo en el cap&iacute;tulo, cada vez me gusta menos el tutorial. Me da la impresi&oacute;n de que van repitiendo una y otra vez lo mismo, a base de pinceladas, pero dando en cada repetici&oacute;n alguna pincelada m&aacute;s. Por llevarlo de forma m&aacute;s c&oacute;moda, imprimo treinta o cuarenta hojas, sin encuadernar de ninguna forma y voy leyendo. En m&aacute;s de una ocasi&oacute;n me ha dado la impresi&oacute;n de haberme equivocado de hoja al leer, porque lo que leo me suena haberlo le&iacute;do ya palabra por palabra. Y resulta que no, simplemente vuelven a repetirlo m&aacute;s adelante y le a&ntilde;aden algo m&aacute;s, un poco m&aacute;s de detalle.</p>
<p>En fin, empieza a resultar repetitivo y algo pesado. Creo que voy a ir saltando a aquellas partes que m&aacute;s me interesen o de las que todav&iacute;a no he le&iacute;do nada y dedicarme m&aacute;s a jugar con eclipse, tomcat y compa&ntilde;&iacute;a.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chuidiang.com/2011/05/13/tutorial-de-java-ee/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Jugando con javadocx</title>
		<link>http://blog.chuidiang.com/2011/04/16/jugando-con-javadocx/</link>
		<comments>http://blog.chuidiang.com/2011/04/16/jugando-con-javadocx/#comments</comments>
		<pubDate>Sat, 16 Apr 2011 09:44:51 +0000</pubDate>
		<dc:creator>Chuidiang</dc:creator>
				<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[docx]]></category>
		<category><![CDATA[javadocx]]></category>

		<guid isPermaLink="false">http://blog.chuidiang.com/?p=903</guid>
		<description><![CDATA[Javadocx es una librer&#237;a java que permite generar documentos docx &#160;La gente de javadocx se puso en contacto conmigo a trav&#233;s de twitter. Quer&#237;an que publicara una nota de prensa que anunciaba el lanzamiento de la versi&#243;n 2.0. As&#237; que me decid&#237; primero a probar un poco la librer&#237;a e incluso hacer alg&#250;n peque&#241;o tutorial [...]]]></description>
			<content:encoded><![CDATA[<p>Javadocx es una librer&iacute;a java que permite generar documentos docx</p>
<p>&nbsp;La gente de <a href="http://www.javadocx.com/">javadocx</a> se puso en contacto conmigo a trav&eacute;s de <a href="http://twitter.com/chuidiang">twitter</a>. Quer&iacute;an que publicara una nota de prensa que anunciaba el <a href="http://www.javadocx.com/archives/1867">lanzamiento de la versi&oacute;n 2.0</a>. As&iacute; que me decid&iacute; primero a probar un poco la librer&iacute;a e incluso hacer alg&uacute;n peque&ntilde;o tutorial en la <a href="http://chuwiki.chuidiang.org/index.php?title=P%C3%A1gina_Principal">Chuwiki</a> si se terciaba.</p>
<p>La librer&iacute;a se baja en forma de fuentes java que necesitamos compilar con ant. As&iacute; que me descargu&eacute; tambi&eacute;n <a href="http://ant.apache.org/">ant</a>, ya que hace tiempo que reemplac&eacute; su uso por <a href="http://maven.apache.org/">maven</a> y no lo ten&iacute;a instalado. El compilado fue bien a la primera, salvo por unos peque&ntilde;os warnings relativos a algo de unos caracteres extra&ntilde;os de un idioma extra&ntilde;o. No s&eacute; si el warning es importante, pero lo comento m&aacute;s abajo.</p>
<p>Miro la documentaci&oacute;n en la p&aacute;gina web de javadocx para ver c&oacute;mo empezar. La documentaci&oacute;n me remite a los ejemplos java que vienen con la librer&iacute;a, as&iacute; que me voy a mirarlos. La verdad es que los ejemplos son muy sencillos y al ejecutarlos se genera el docx sin problemas. Casi nada m&aacute;s verlos y ejecutarlos, decid&iacute; que no merec&iacute;a la pena hacer un tutorial en la Chuwiki. El tutorial, de hacerlo, ser&iacute;a pr&aacute;cticamente copiar y pegar esos ejemplos.</p>
<p>Me llev&eacute; una peque&ntilde;a sorpresa al abrir el docx generado con el word. Nada m&aacute;s abrirlo me salen un par de errores, pero aceptando la ventana de error, el documento se abre correctamente. Comentando el problema con la gente de javadocx, me comentan que es un caso raro que pasa con algunas versiones concretas de sistema operativo/m&aacute;quina virtual java y se debe a caracteres chinos y japoneses que no reconoce correctamente. Qu&eacute; casualidad, justo los warnings que me dio al compilar. La verdad es que tengo un Windows Vista muy machacado (lleva casi cuatro a&ntilde;os instalado) y yo soy un &quot;culo inquieto&quot;, por lo que estoy continuamente instalando y desinstalando programas, librer&iacute;as, herramientas y todo lo que se me ocurre.</p>
<p>Lo otro que he echado de menos es una documentaci&oacute;n con las opciones que se pueden poner en los distintos m&eacute;todos. Me explico. El siguiente ejemplo que viene con la librer&iacute;a genera un docx con un p&aacute;rrafo</p>
<blockquote>
<p>CreateDocx docx = new CreateDocx(&quot;docx&quot;);<br />
String text = &quot;Lorem ipsum dolor sit amet, consectetur adipisicing elit&quot;<br />
+ &quot; sed do eiusmod tempor incididunt ut labore et dolore magna &quot;<br />
+ &quot;aliqua. Ut enim ad minim veniam, quis nostrud exercitation &quot;<br />
+ &quot;ullamco laboris nisi ut aliquip ex ea commodo consequat. &quot;<br />
+ &quot;Duis aute irure dolor in reprehenderit in voluptate velit &quot;<br />
+ &quot;esse cillum dolore eu fugiat nulla pariatur. Excepteur sint &quot;<br />
+ &quot;occaecat cupidatat non proident, sunt in culpa qui officia &quot;<br />
+ &quot;deserunt mollit anim id est laborum.&quot;;<br />
HashMap paramsText = new HashMap();<br />
paramsText.put(&quot;b&quot;, &quot;single&quot;);<br />
paramsText.put(&quot;font&quot;, &quot;Arial&quot;);</p>
<p>docx.addText(text, paramsText);</p>
</blockquote>
<blockquote>
<p>docx.createDocx(&quot;example_text&quot;);<br />
&nbsp;</p>
</blockquote>
<p>&nbsp;Como se puede ver, al addText() se le pasa un paramsText que es un conjunto de parejas clave-valor. Pues bien, no he encontrado en la documentaci&oacute;n un listado de qu&eacute; claves son posibles ni sus valores posibles. Busc&aacute;ndolo, me puse a mirar dentro del c&oacute;digo de la librer&iacute;a y he visto que pr&aacute;cticamente esas claves-valor son las que se escriben directamente en el docx. Eso hace pensar que esas claves-valor son propias del formato docx y no de la librer&iacute;a.</p>
<p>Me pongo a investigar el formato docx y veo que un docx no es m&aacute;s que un fichero zip que podemos desempaquetar con winzip, winrar o cualquiera de esas herramientas. Una vez desempaquetado, tenemos un mont&oacute;n de ficheros xml y efectivamente, esas parejas clave-valor forman m&aacute;s o menos parte de los xml.</p>
<p>Resumiendo, una librer&iacute;a muy sencilla de usar y a tener en cuenta si queremos generar desde java este tipo de documentos. La peque&ntilde;a pega es que necesitaremos conocer o tener una referencia al formato docx para saber exactamente c&oacute;mo hacer algo que no aparezca tal cual en los ejemplos que vienen.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chuidiang.com/2011/04/16/jugando-con-javadocx/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Malditas variables estáticas</title>
		<link>http://blog.chuidiang.com/2011/03/10/malditas-variables-estaticas/</link>
		<comments>http://blog.chuidiang.com/2011/03/10/malditas-variables-estaticas/#comments</comments>
		<pubDate>Thu, 10 Mar 2011 14:20:54 +0000</pubDate>
		<dc:creator>Chuidiang</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[junit]]></category>

		<guid isPermaLink="false">http://blog.chuidiang.com/?p=886</guid>
		<description><![CDATA[En una aplicaci&#243;n m&#225;s o menos grande y seria de java es normal leer alg&#250;n fichero con propiedades de configuraci&#243;n para nuestro programa. Esas propiedades suelen ser m&#250;ltiples y variadas, para m&#243;dulos de todos los niveles que no tienen nada que ver unos con otros. Una opci&#243;n es leer ese fichero de propiedades desde un [...]]]></description>
			<content:encoded><![CDATA[<p>En una aplicaci&oacute;n m&aacute;s o menos grande y seria de java es normal leer alg&uacute;n fichero con propiedades de configuraci&oacute;n para nuestro programa. Esas propiedades suelen ser m&uacute;ltiples y variadas, para m&oacute;dulos de todos los niveles que no tienen nada que ver unos con otros.</p>
<p>Una opci&oacute;n es leer ese fichero de propiedades desde un sitio cercano al main() de nuestra aplicaci&oacute;n e ir pasando estas propiedades a los distintos m&oacute;dulos. Si hay m&oacute;dulos en varios niveles, estos deber&aacute;n ir pas&aacute;ndose las propiedades de unos a otros, ya que el main() posiblemente no pueda acceder directamente a los m&oacute;dulos de bajo nivel.</p>
<p>Para evitar este trasiego de propiedades por todo el c&oacute;digo, tiendo a hacer un c&oacute;digo java de este estilo</p>
<blockquote>
<p>public class FicheroPropiedades {</p>
<p>&nbsp;&nbsp; private static String pathFicheroPropiedades = &quot;path/fichero.properties&quot;;</p>
<p>&nbsp;&nbsp; private static Properties propiedades = null;</p>
<p>&nbsp;&nbsp; static {<br />
&nbsp;&nbsp; &nbsp; &nbsp;propiedades = cargaFichero();<br />
&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp; public static String getProperty (String key) {<br />
&nbsp;&nbsp; &nbsp; &nbsp;return properties.getProperty(key);<br />
&nbsp;&nbsp; }<br />
}</p>
</blockquote>
<p>Es decir, una clase con todo est&aacute;tico a la que pedir los valores de las propiedades y un inicializador est&aacute;tico de forma que el fichero de propiedades se cargar&aacute; en cuanto alguien &quot;mencione&quot; esta clase.</p>
<p>Pues bien, esto son todo problemas para los test de JUnit.</p>
<p>Por un lado, posiblemente tengamos o queramos un fichero de propiedades espec&iacute;fico para nuestros test. O queramos cambiar alguna propiedad en alg&uacute;n test. Al leer nuestro c&oacute;digo bajo test las propiedades de esta clase, es necesario hacerle cosas a esta clase para poder modificarla a gusto. Por ejemplo, poner public el path del fichero para poder cargar un fichero distinto en los test, o poner un cargaFichero(path), o a&ntilde;adir un setProperty() para modificar alguna propiedad concreta, o cualquier otra modificaci&oacute;n que se os ocurra. Pero eso no es bonito. No es bonito tener que modificar una clase de nuestro c&oacute;digo real para poder manejarla desde los test.</p>
<p>Por otro lado, si tenemos alguna herramienta que ejecuta autom&aacute;ticamente todos los test, es posible que esta clase s&oacute;lo se inicialice en la ejecuci&oacute;n del primer test, manteniendo sus valores para el resto de test. O que al pasar alg&uacute;n test que modifica propiedades, las deje modificadas para el siguiente. En fin, que podemos tener problemas en funci&oacute;n de qu&eacute; test se ejecuten primero, o si a&ntilde;adimos un test nuevo que modifique estas propiedades, puede alterar el resultado de los que van detr&aacute;s.</p>
<p>Este es otro motivo, adem&aacute;s de la mantenibilidad del c&oacute;digo, para no usar/acceder a atributos est&aacute;ticos desde todo el c&oacute;digo &nbsp;si no es realmente necesario. Los test de JUnit pueden hacerse dependientes del orden en que se ejecutan, ya que unos pueden cambiar o no los valores de estas variables est&aacute;ticas seg&uacute;n sus necesidades, incordiando a los que vienen detr&aacute;s.</p>
<p>Aunque sea un poco rollo a la hora de codificar, suele ser mejor pasar las cosas a cada m&oacute;dulo a traves de m&eacute;todos set() o en el constructor, aunque sea todo de golpe con un setProperties(Properties), que andar inicializando autom&aacute;ticamente variables est&aacute;ticas y acceder a ellas desde todos sitios.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chuidiang.com/2011/03/10/malditas-variables-estaticas/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>La maldición de las herramientas</title>
		<link>http://blog.chuidiang.com/2010/11/28/la-maldicion-de-las-herramientas/</link>
		<comments>http://blog.chuidiang.com/2010/11/28/la-maldicion-de-las-herramientas/#comments</comments>
		<pubDate>Sun, 28 Nov 2010 13:03:34 +0000</pubDate>
		<dc:creator>Chuidiang</dc:creator>
				<category><![CDATA[anécdotas]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jax-ws]]></category>
		<category><![CDATA[web services]]></category>
		<category><![CDATA[wsgen]]></category>
		<category><![CDATA[wsimport]]></category>

		<guid isPermaLink="false">http://blog.chuidiang.com/?p=858</guid>
		<description><![CDATA[&#160;Es bastante habitual que la gente que empieza a aprender java (o cualquier otro lenguaje de programaci&#243;n) coja el IDE correspondiente (eclipse, netbeans o el que sea) &#160;y se ponga a aprender. Esos novatos van programando y con el tiempo van cogiendo ciertos conocimientos y experiencia en java. Pero desgraciadamente, el IDE les hace no [...]]]></description>
			<content:encoded><![CDATA[<p><img alt="web services internet" vspace="10" hspace="10" align="right" src="http://img230.imageshack.us/img230/6757/internetu.jpg" />&nbsp;Es bastante habitual que la gente que empieza a aprender java (o cualquier otro lenguaje de programaci&oacute;n) coja el IDE correspondiente (eclipse, netbeans o el que sea) &nbsp;y se ponga a aprender. Esos novatos van programando y con el tiempo van cogiendo ciertos conocimientos y experiencia en java. Pero desgraciadamente, el IDE les hace no aprender ciertas cosas b&aacute;sicas. No es raro encontrarse gente que lleva programando alg&uacute;n tiempo pero que ser&iacute;a incapaz de compilar o ejecutar un programa java desde l&iacute;nea de comandos, usando los comandos java, el compilador javac, o generar su jar con el comando jar.</p>
<p>Y esto no solo pasa con las cosas b&aacute;sicas ni s&oacute;lo con los novatos. Cuanto m&aacute;s complejo sea el tema y m&aacute;s nos resuelva un IDE o una herramienta/framework cualquiera, menos cosas aprendemos de ese tema y m&aacute;s dependemos del IDE/herramienta/framework. Cuento mi caso de hace un par de d&iacute;as.</p>
<p>Llevo ya unos d&iacute;as trabajando con Web Services con jax-ws. Cuando empec&eacute; con ello, no me le&iacute; la documentaci&oacute;n completa (soy un impaciente) y en seguida me puse a buscar ejemplos de aqu&iacute; y de all&iacute; para ir haciendo mi propio c&oacute;digo. Le&iacute; en la documentaci&oacute;n que para hacer un Web Services bastaba con ponerle unas anotaciones a la clase (@WebService, @WebMethod, etc), compilarla de forma normal, pasarle la herramienta wsgen que viene con jax-ws y listo. Pues bien, eso hice, montando todo desde el principio con maven y plugins de maven. Y desde luego, pasando ese wsgen autom&aacute;ticamente en la fase posterior al compilado.</p>
<p>Hace un par de d&iacute;as me decid&iacute; a hacer un tutorial sobre la aprendido y quise hacerlo m&aacute;s de forma manual, dependiendo lo menos posible de herramientas (eclipse, maven, etc). As&iacute; que me puse a ello &#8230; y empezaron las dudas y a ponerse de manifiesto las grandes lagunas en mi conocimiento.</p>
<p>El problema desencadenante de todo es que hice todos los pasos para el tutorial sin usar la herramienta wsgen y el web service me funciona. Una clase con las anotaciones correspondientes, un main() que arranca un EndPoint, no se pasa el wsgen y funciona, arrancado desde l&iacute;nea de comandos.</p>
<p>Bueno, seg&uacute;n la documentaci&oacute;n, despu&eacute;s de pasar el wsgen se hace el war para desplegarlo en Tomcat o similar. Ser&aacute; entonces que si usas EndPoint no necesitas pasar wsgen, quiz&aacute;s EndPoint hace todo eso que hace wsgen de forma autom&aacute;tica. Pero lo grave de todo es que s&iacute;, se supone que hay que pasar wsgen, pero realmente no s&eacute; qu&eacute; hace wsgen (s&iacute; lo s&eacute;, genera unos fuentes java que no s&eacute; exactamente para qu&eacute; sirven).</p>
<p>As&iacute; que nada, seguir&eacute; de forma manual, intentar&eacute; montar el &quot;hola mundo&quot; en un tomcat y ver&eacute; si ah&iacute; es necesario o no el wsgen&#8230; Y luego a pelearse con la parte del cliente, que aunque tambi&eacute;n la se hacer con herramientas, tampoco entiendo el fondo de todo.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chuidiang.com/2010/11/28/la-maldicion-de-las-herramientas/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Winpcap, jpcap y java</title>
		<link>http://blog.chuidiang.com/2010/11/24/winpcap-jpcap-y-java/</link>
		<comments>http://blog.chuidiang.com/2010/11/24/winpcap-jpcap-y-java/#comments</comments>
		<pubDate>Wed, 24 Nov 2010 11:22:42 +0000</pubDate>
		<dc:creator>Chuidiang</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[ip]]></category>
		<category><![CDATA[jpcap]]></category>
		<category><![CDATA[sniffer]]></category>
		<category><![CDATA[winpcap]]></category>

		<guid isPermaLink="false">http://blog.chuidiang.com/?p=860</guid>
		<description><![CDATA[&#160;En uno de los proyectos (java) ten&#237;a necesidad de tocar uno de los campos que hay en las cabeceras IP de los mensajes, en concreto, el campo de tipo de servicio, que de alguna forma establece prioridades para el mensaje. Mirando la API de java, veo que la clase Socket tiene un m&#233;todo setTrafficClass() que [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;En uno de los proyectos (java) ten&iacute;a necesidad de tocar uno de los campos que hay en las <a href="http://es.wikipedia.org/wiki/Cabecera_IP">cabeceras IP</a> de los mensajes, en concreto, el campo de tipo de servicio, que de alguna forma establece prioridades para el mensaje.</p>
<p>Mirando la API de java, veo que la clase Socket tiene un m&eacute;todo setTrafficClass() que de alguna manera sirve para cambiar este campo, pero f&iacute;jate t&uacute; que cosas, hago mis pruebas, arranco un sniffer (<a href="http://www.wireshark.org/">Wireshark</a> gratuito) y de todos los bits de ese campo s&oacute;lo consigo cambiar el segundo. Todos los dem&aacute;s bits siempre se captura con ceros. No es de extra&ntilde;ar, la misma API de java indica que ese m&eacute;todo puede o no funcionar dependiendo del &quot;underlying network implementation&quot;, as&iacute; que empiezo a buscar librer&iacute;as que me faciliten esto.</p>
<p>Al final, el conjunto de librer&iacute;as a usar es <a href="http://www.winpcap.org/">Winpcap</a> + <a href="http://netresearch.ics.uci.edu/kfujii/Jpcap/doc/">jpcap</a>. La primera es un instalable windows que nos proporciona unas librer&iacute;as de base (dll) para programar sockets a bajo nivel. La segunda es una librer&iacute;a java que nos facilita las llamadas a la librer&iacute;a Winpcap. Con ambas juntas, podemos programar sockets a bajo nivel desde java con comodidad. Eso s&iacute;, hay JNI entre medias aunque no lo veamos al programar.</p>
<p>La aplicaci&oacute;n t&iacute;pica que muestra en los ejemplos de esta librer&iacute;a jpcap es la captura de paquetes de red, para hacerse uno su propio sniffer. Tambi&eacute;n permite el env&iacute;o de paquetes IP, dando valores a todos los campos de la cabecera IP a nuestro gusto. Tras pelearme con ella un par de d&iacute;as, todo parece funcionar bien. Sin embargo, en esos d&iacute;as encontr&eacute; pegas que &iquest;c&oacute;mo no?, pongo aqu&iacute;. No son pegas de la librer&iacute;a, sino del entorno. All&aacute; van:</p>
<ol>
<li>Posiblemente se necesitan permisos de administrador para ejecutar nuestro programa si anda manejando las tarjetas de red con la librer&iacute;a jpcap.</li>
<li>En Windows XP hay una variable de registro que debe tener un valor concreto para que nuestro programa tenga permisos para modificar el campo traffic class:&nbsp;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters : &quot;DisableUserTOSSetting&quot;=dword:00000000</li>
<li>Cuando se env&iacute;a un paquete IP, en el ejemplo pone unas direcciones mac &quot;aleatorias&quot;. Para que funcione bien es importante poner direcciones mac correctas. La de origen puede tener o no importancia, dependiendo de si por debajo se nos permite o no enviar cabeceras IP con una mac propia falsa. La de destino debe ser correcta o el mensaje nunca llegar&aacute;. Se puede poner 255:255:255:255:255:255 si la mac de destino es desconocida.</li>
<li>La mayor&iacute;a de los routers/switch de la red est&aacute;n configurados por defecto para poner a cero los campos del traffic class de la cabecera IP, por lo que aunque cambiemos esos campos, es muy posible que a destino lleguen como ceros. No es que no funcione la librer&iacute;a, sino que hay que configurar bien los routers/switches.</li>
<li>As&iacute; que el sniffer que usemos para ver si todo va como debe, debemos arrancarlo tanto en el PC que env&iacute;a como en el que recibe. En el que env&iacute;a podemos ver si hemos rellenado todos los campos como queremos. En el que recibe veremos si ning&uacute;n router malvado lo ha modificado por el camino.</li>
</ol>
<p>En fin, que he estado entretenido un par de d&iacute;as.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chuidiang.com/2010/11/24/winpcap-jpcap-y-java/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Jugando con Proguard</title>
		<link>http://blog.chuidiang.com/2010/10/20/jugando-con-proguard/</link>
		<comments>http://blog.chuidiang.com/2010/10/20/jugando-con-proguard/#comments</comments>
		<pubDate>Wed, 20 Oct 2010 13:06:19 +0000</pubDate>
		<dc:creator>Chuidiang</dc:creator>
				<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[proguard]]></category>

		<guid isPermaLink="false">http://blog.chuidiang.com/?p=852</guid>
		<description><![CDATA[&#160;Estos d&#237;as estoy jugando con Proguard, una herramienta que coge nuestro jar en java y realiza b&#225;sicamente tres tareas: ofuscarlo, optimizarlo y eliminar sobrantes. Por supuesto, estas tareas son independientes y podemos realizar unas s&#237; y otras no a nuestro gusto. Tiene plugin para maven, por lo que si usamos maven, podemos realizar cualquiera de [...]]]></description>
			<content:encoded><![CDATA[<p><img alt="Candado de c&oacute;digo ofuscado" width="400" height="413" vspace="10" hspace="10" align="right" src="http://www.elgrantlapalero.com/catalogo/images/pt_110.jpeg" />&nbsp;Estos d&iacute;as estoy jugando con <a href="http://proguard.sourceforge.net/">Proguard</a>, una herramienta que coge nuestro jar en java y realiza b&aacute;sicamente tres tareas: ofuscarlo, optimizarlo y eliminar sobrantes. Por supuesto, estas tareas son independientes y podemos realizar unas s&iacute; y otras no a nuestro gusto. Tiene <a href="http://pyx4me.com/pyx4me-maven-plugins/proguard-maven-plugin/">plugin para maven</a>, por lo que si usamos maven, podemos realizar cualquiera de estas tres tareas autom&aacute;ticamente al generar nuestro jar.</p>
<p><strong>Ofuscado</strong></p>
<p>La parte de ofuscado es sencilla, s&iacute;mplemente coge los paquetes, las clases y los m&eacute;todos y les cambia el nombre por a, b, c, etc. As&iacute;, en vez de persona.setId(7), si descompilamos ver&iacute;amos a.b(7). Es decir, se puede seguir descompilando pero el c&oacute;digo es mucho menos claro.</p>
<p>Tiene opciones para decirle qu&eacute; clases o m&eacute;todos no debe ofuscar. Son candidatos claros a no ofuscar el m&eacute;todo main() de la clase principal e incluso el nombre de esa clase, para que luego la m&aacute;quina virtual java sepa qu&eacute; debe ejecutar. Los m&eacute;todos write() y read(9 de serializaci&oacute;n, etc. Tambi&eacute;n, en el caso de que estemos intentando ofuscar una librer&iacute;a, se deben no ofuscar las clases que se usen desde el programa principal.</p>
<p>Curiosamente, proguard es bastante inteligente y tiene en cuenta la relexi&oacute;n de java. Si ve que usamos cosas como Class.forname(), o Class.getDeclaredMethod()&#8230;., nos avisa con un error si intentamos ofuscar las clases a las que hace referencia esa reflexi&oacute;n.</p>
<p><strong>Optimizado</strong></p>
<p>Con esto no me he metido a fondo, porque no hay muchas posibilidades de ver qu&eacute; es lo que hace. Entiendo que limpia nuestro c&oacute;digo ineficiente, borrando variables locales no usadas o arreglando cualquier cosa que tenga que ver con la efectividad de nuestro c&oacute;digo.</p>
<p><strong>Eliminar sobrantes</strong></p>
<p>Esta es la funcionalidad que no esperaba de la herramienta y que m&aacute;s me ha llamado la atenci&oacute;n. Elimina de nuestro jar todas las clases que no usamos y borra todos los m&eacute;todos que no se usan en el resto de clases. &iquest;Y c&oacute;mo sabe si lo usamos o no?. Pues por la clase que le hemos dicho que contiene el main(). Empieza a tirar de ah&iacute; y borra todo lo que no se use. El resultado es que en muchas ocasiones obtendremos un jar mucho m&aacute;s peque&ntilde;o si llevamos tiempo trabajando en el proyecto y somos reacios a borrar clases y m&eacute;todos que no se usan &quot;por si acaso me hacen falta m&aacute;s adelante&quot;.</p>
<p>Y ya lo m&aacute;ximo, al integralo en maven, el proceso queda totalmente autom&aacute;tico, por lo que una vez configurado en nuestro pom.xml, podemos olvidarnos de que usamos esa herramienta y seguir con nuestros comandos de maven t&iacute;pico mvn package, mvn install, mvn deploy, etc. Eso s&iacute;, ojo al hacer el javadoc.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chuidiang.com/2010/10/20/jugando-con-proguard/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>jax-ws y maven</title>
		<link>http://blog.chuidiang.com/2010/09/29/jax-ws-y-maven/</link>
		<comments>http://blog.chuidiang.com/2010/09/29/jax-ws-y-maven/#comments</comments>
		<pubDate>Wed, 29 Sep 2010 12:17:33 +0000</pubDate>
		<dc:creator>Chuidiang</dc:creator>
				<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[axis2]]></category>
		<category><![CDATA[jax-ws]]></category>
		<category><![CDATA[web services]]></category>

		<guid isPermaLink="false">http://blog.chuidiang.com/?p=847</guid>
		<description><![CDATA[&#160;Siguiendo con los web services y yo, he estado probando herramientas como axis2 y jax-ws. Por supuesto, nada me ha funcionado a la primera y llevo casi dos d&#237;as pele&#225;ndome con esto para arrancar un &#34;hola mundo&#34; Con axis2 el problema es que se me ocurri&#243; hacerme mi propia clase de ejemplo, sin copiar la [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;Siguiendo con los web services y yo, he estado probando herramientas como <a href="http://ws.apache.org/axis2/">axis2</a> y <a href="https://jax-ws.dev.java.net/">jax-ws</a>. Por supuesto, nada me ha funcionado a la primera y llevo casi dos d&iacute;as pele&aacute;ndome con esto para arrancar un &quot;hola mundo&quot;</p>
<p>Con axis2 el problema es que se me ocurri&oacute; hacerme mi propia clase de ejemplo, sin copiar la de los tutoriales. Al final descubro que no soporta enumerados de java y qu&eacute; casualidad, a m&iacute; se me hab&iacute;a ocurrido poner uno de los m&eacute;todos con un par&aacute;metro enumerado. Una vez conseguido arrancar un servidor y hacerme un cliente, el servidor me da error cuando intento acceder al web service desde el ciente. Ante las pocas pistas que daba el error, decid&iacute; dejar axis-2 de momento y probar con jax-ws.</p>
<p>Con jax-ws me cree un proyecto maven y me puse a ello. Pues bien, las dependencias maven te&oacute;ricas seg&uacute;n la documentaci&oacute;n son estas&nbsp;<a href="https://jax-ws.dev.java.net/guide/Using_JAX_WS_from_Maven.html">https://jax-ws.dev.java.net/guide/Using_JAX_WS_from_Maven.html</a>&nbsp;. Creo el proyecto, arranco el servidor y todo aparentemente correcto. Accedo desde un navegador a http://localhost:8080/MiServicio?WDSL con el que te&oacute;ricamente deber&iacute;a obtener el fichero WSDL del servicio&#8230; y el servidor da error. Buscando el error por google, me encuentro con esto&nbsp;<a href="http://forums.java.net/jive/message.jspa?messageID=222799">http://forums.java.net/jive/message.jspa?messageID=222799</a>&nbsp;Parece que la librer&iacute;a sjsxp de la que depende seg&uacute;n maven el jax-ws no es correcta y hay que coger la versi&oacute;n 1.0.1 en vez de la 1.0. As&iacute; que me toca &quot;tunear&quot; el pom.xml y hacer esta &ntilde;apa</p>
<blockquote>
<p>&nbsp;</p>
<div><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;dependency&gt;</div>
<div><span class="Apple-tab-span" style="white-space:pre">			</span>&lt;groupId&gt;com.sun.xml.ws&lt;/groupId&gt;</div>
<div><span class="Apple-tab-span" style="white-space:pre">			</span>&lt;artifactId&gt;jaxws-rt&lt;/artifactId&gt;</div>
<div><span class="Apple-tab-span" style="white-space:pre">			</span>&lt;version&gt;2.1.1&lt;/version&gt;</div>
<div><span class="Apple-tab-span" style="white-space:pre">			</span>&lt;exclusions&gt;</div>
<div><span class="Apple-tab-span" style="white-space:pre">				</span>&lt;exclusion&gt;</div>
<div><span class="Apple-tab-span" style="white-space:pre">					</span>&lt;groupId&gt;com.sun.xml.stream&lt;/groupId&gt;</div>
<div><span class="Apple-tab-span" style="white-space:pre">					</span>&lt;artifactId&gt;sjsxp&lt;/artifactId&gt;</div>
<div><span class="Apple-tab-span" style="white-space:pre">				</span>&lt;/exclusion&gt;</div>
<div><span class="Apple-tab-span" style="white-space:pre">			</span>&lt;/exclusions&gt;</div>
<div><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;/dependency&gt;</div>
<div><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;dependency&gt;</div>
<div><span class="Apple-tab-span" style="white-space:pre">			</span>&lt;groupId&gt;com.sun.xml.stream&lt;/groupId&gt;</div>
<div><span class="Apple-tab-span" style="white-space:pre">			</span>&lt;artifactId&gt;sjsxp&lt;/artifactId&gt;</div>
<div><span class="Apple-tab-span" style="white-space:pre">			</span>&lt;version&gt;1.0.1&lt;/version&gt;</div>
<div><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;/dependency&gt;</div>
</blockquote>
<div>Dicho de otra forma, poner la dependencia de jaxws-rt, decirle que no me traiga su sjsxp y luego poner la dependencia del que yo quiero. Esto ha funcionado bien y ya tengo el servidor arrancado. Ahora toca pelearse con el cliente&#8230;. espero no tener demasiados problemas. Luego volver&eacute; con axis2.</div>
<div>&nbsp;</div>
<div>Y aunque todav&iacute;a tengo que probar m&aacute;s, de momento me gusta mucho m&aacute;s jax-ws que axis2. Los scripts de axis2 generan montones de clases que luego tampoco facilitan tanto la creaci&oacute;n de un cliente. jax-ws tambi&eacute;n genera clases, pero parece que son menos y adem&aacute;s quedan &quot;ocultas&quot;, ya que genera los .class que luego se empaquetan en el war o jar.</div>
<div>&nbsp;</div>
<div>Lo segundo que no me ha gustado de axis2 es que aparentemente no tiene posibilidad de hacer un main() que arranque un servidor web con los webservices, dependemos de un Tomcat ajeno con una webapp axis2 instalada sobre la que desplegamos nuestros web services. Bueno, s&iacute; tiene un servidor, pero seg&uacute;n la documentaci&oacute;n puede usarse sin garant&iacute;as, ya que no est&aacute; soportado. jax-ws permite hacerse un main y publicar el servicio de una forma tan f&aacute;cil como esta</div>
<blockquote>
<div>public static void main(String [] args) {<br />
&nbsp;&nbsp; Endpoint.publish(&quot;http//localhost:8080/MiServicio&quot;, new MiWebService());<br />
&nbsp;&nbsp; // Aqui puedes seguir haciendo cosas.<br />
}</div>
</blockquote>
<div>Bueno, no es nada grave si quieres publicar webservices en internet. Pero en mi caso, necesito que el servidor aparte de publicar los webservices, haga m&aacute;s cosas.</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.chuidiang.com/2010/09/29/jax-ws-y-maven/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

