Screenshot from 2017-11-08 14-43-11

I’ve started a project with jhipster@4.10.2 and ran the usual yarn install and afterwards mvn, it executed fine and I could see the result on http://localhost:8080.
Then, I opened the project on [IntelliJ] and followed the steps on the guide to configure the IDE to exclude directories, enable spring support, enable javascript code support and -the most important feature to me- application hot restart. The last step in the guide is to enable the maven IDE profile, but it caused the following error

Error:(19, 8) java: cannot access javax.servlet.Filter
class file for javax.servlet.Filter not found

when I tried to run the app (right click your app class file src/main/java/{package}/{appname}.java and choose ‘Run’), well actually at compile time.

I just had to disable the IDE maven profile to get it working again.

Anuncios

Java – Maven o Gradle

noviembre 4, 2014

Maven

Maven es una herramienta de software para la gestión y construcción de proyectos Java –Wikipedia

Gradle

Gradle es una herramienta de automatización de proyecto que se basa en los conceptos de Apache Ant y Maven e introduce un lenguaje específico de dominio (DSL) basado en Groovy en lugar de la forma más tradicional de declarar la configuración del proyecto con XML.
Gradle fue diseñado para una solución multi-proyecto que puede llegar a ser bastante grande, y es compatible con compilaciones incrementales que determina inteligentemente qué partes del árbol de construcción han sido actualizadas, por lo que ninguna tarea dependendiente va a ser re-ejecutada. –Wikipedia

Hasta ahora había utilizado Maven como herramienta de gestión de proyectos, pero la siguiente afirmación me ha hecho pensar en utilizar Gradle para los nuevos proyectos

Google adopted Gradle as the default build tool for the Android OS –technologyconversations.com

Fuentes:
http://technologyconversations.com/2014/06/18/build-tools/

I have a Java application configured with Maven. I have all my model and web services in this application (backend). In a Java app normally you would have your web client code in src/main/webapp (frontend). I scaffold-ed the client application with yeoman, so it uses grunt to build and bower to manage dependencies. Great! well, not so much, it runs perfectly in my local environment (I can run bower install, then grunt build and it would generate a “dist” folder with all my sources compiled and minified) but it doesn’t work on heroku’s platform.

The problem is heroku detects my app only as Java application so it doesn’t run bower install nor grunt build.

I tried to use heroku-buildpack-multi with some issues, I even created my own patched version that allows to specify a base path for each buildpack. With that I can push to heroku and it runs mvn package and then npm install for the node buildpack. I’ve added a postinstall script to run both bower install and grunt build, which in turn you need to add as dependencies in your package.json.

{
  "name": "webapp",
  "version": "0.0.0",
  "dependencies": {
    "grunt": "^0.4.1",
    "grunt-cli": "~0.1.13",
    "bower": "~1.3.9",
    "grunt-autoprefixer": "^0.7.3",
    "grunt-concurrent": "^0.5.0",
    "grunt-contrib-clean": "^0.5.0",
    "grunt-contrib-compass": "^0.7.2",
    "grunt-contrib-concat": "^0.4.0",
    "grunt-contrib-connect": "^0.7.1",
    "grunt-contrib-copy": "^0.5.0",
    "grunt-contrib-cssmin": "^0.9.0",
    "grunt-contrib-htmlmin": "^0.3.0",
    "grunt-contrib-imagemin": "^0.7.0",
    "grunt-contrib-jshint": "^0.10.0",
    "grunt-contrib-uglify": "^0.4.0",
    "grunt-contrib-watch": "^0.6.1",
    "grunt-filerev": "^0.2.1",
    "grunt-google-cdn": "^0.4.0",
    "grunt-karma": "^0.8.3",
    "grunt-newer": "^0.7.0",
    "grunt-ngmin": "^0.0.3",
    "grunt-svgmin": "^0.4.0",
    "grunt-usemin": "^2.1.1",
    "grunt-wiredep": "^1.7.0",
    "jshint-stylish": "^0.2.0",
    "karma": "^0.12.17",
    "karma-jasmine": "^0.1.5",
    "karma-phantomjs-launcher": "^0.1.4",
    "load-grunt-tasks": "^0.4.0",
    "time-grunt": "^0.3.1"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "scripts": {
    "test": "grunt test",
    "postinstall": "./node_modules/bower/bin/bower install && ./node_modules/grunt-cli/bin/grunt build"
  }
}

It effectively run bower install and then grunt build, but it failed because my scaffold-ed client uses compass which in turn requires ruby, arrrgh! This is where I stopped looking into this path, I’ve decided to build on my local computer and include the “dist” folder on source control (against all my principles), as suggested by various websites, for now.

Sources:
https://github.com/ddollar/heroku-buildpack-multi
https://discussion.heroku.com/t/grunt-task-after-deployment/253

git – saltos de línea CRLF

Si en tu equipo de trabajo utilizan computadoras con Windows y Linux (o Mac) para desarrollar, seguramente tendrán un problema con los saltos de línea. Git resuelve este problema mediante el parámetro de configuración ‘core.autocrlf’.

En las computadoras con Windows establece este parámetro en ‘true’ mediante el comando

git config –global core.autocrlf true

En las computadoras con Linux (Mac) debe ser falso (default).

CP-1252

Otro problema que se nos presentó, debido a este ambiente heterogéneo, fue la codificación de los proyectos. La codificacioón por default en Windows (en español) es CP-1252 mientras que Linux utiliza UTF-8. Para que nuestros proyectos Maven puedan ser compilados en ambas plataformas, es necesario agregar el siguiente parámetro de configuración al archivo pom.xml

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

Fuentes:
git book
http://stackoverflow.com/questions/9976616/maven-platform-encoding

Tenemos un proyecto de GWT con multiples módulos organizados de forma jerárquica. Para la administración de las dependencias utilizamos Maven, además de que nos ayuda a generar el archivo WAR para instalarlo en un servidor de aplicaciones (JBoss).

Pues cuando intentamos compilar este proyecto en Windows, el plugin maven-datanucleus-plugin nos arrojó un error con un mensaje parecido al siguiente:

La línea de comandos es demasiado larga

Para corregirlo utilizamos la siguiente configuración en el archivo pom.xml

    <build></p><plugins><plugin>                <groupId>org.datanucleus</groupId>
                <artifactId>maven-datanucleus-plugin</artifactId>
                <version>${maven-datanucleus-plugin.version}</version>
                <configuration>
                    <fork>false</fork>
                    <log4jConfiguration>${basedir}/src/main/resources/log4j.properties</log4jConfiguration>
                    <verbose>true</verbose></p><props>${basedir}/src/main/resources/datanucleus.properties</props>                </configuration>
                <executions>
                    <execution></p><phase>process-classes</phase>                        <goals>
                            <goal>enhance</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>        </plugins>    </build>

Lo importante es agregar la opción fork

Fuentes:
http://stackoverflow.com/questions/8353855/the-command-line-is-too-long-standard-error-from-the-datanucleus-tool
https://issues.onehippo.com/browse/REPO-391
http://kindofjava.blogspot.mx/2011/06/java-classpath-via-maven-too-long.html

Para configurar Apache CXF en mis proyectos, me bastaba con agregar la siguiente dependencia en el archivo pom.xml

<dependency>
 <groupId>org.apache.cxf</groupId>
 <artifactId>cxf-rt-frontend-jaxrs</artifactId>
 <version>2.6.2</version>
</dependency>

agregar la configuración en el archivo web.xml

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
 version="2.5">

<context-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>WEB-INF/beans.xml</param-value>
 </context-param>

<listener>
 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>

<servlet>
 <servlet-name>CXFServlet</servlet-name>
 <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
 <load-on-startup>1</load-on-startup>
 </servlet>

<servlet-mapping>
 <servlet-name>CXFServlet</servlet-name>
 <url-pattern>/api/*</url-pattern>
 </servlet-mapping>
</web-app>

y configurar los servicios en el archivo beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxrs="http://cxf.apache.org/jaxrs"
 xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxrs
http://cxf.apache.org/schemas/jaxrs.xsd">

<import resource="classpath:META-INF/cxf/cxf.xml" />
 <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

<jaxrs:server id="arp-rest" address="/rest/arp">
 <jaxrs:serviceBeans>
 <ref bean="arp-rest-empleados" />
 </jaxrs:serviceBeans>
 </jaxrs:server>

<bean id="arp-rest-empleados" class="mx.com.apestudio.gwt.server.api.rest.EmpleadosResource" />
</beans>

Pero la ultima vez que quise hacer esto, me arrojaba las siguientes excepciones:

[WARN] Could not instantiate listener org.springframework.web.context.ContextLoaderListener
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener

Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationListener
El problema es que para las versiones 2.6.x las dependencias de spring fueron marcadas como opcionales. Y estas son utilizadas por el Servlet CXFServlet. Para corregir el problema basta con agregar la dependencia a spring-web en nuestro archivo pom.xml

<dependency>
 <groupId>org.springframework</groupId>
 <artifactId>spring-web</artifactId>
 <version>3.1.1.RELEASE</version>
</dependency>

Si no quieres o no puedes utilizar spring, tendrías que utilizar el servlet CXFNonSpringServlet y configurar los servicios programáticamente.

public class MyServiceServlet extends CXFNonSpringServlet {

private static final long serialVersionUID = 1L;

@Override
 // Called at startup time to register this web service.
 public void loadBus(ServletConfig servletConfig) {
 super.loadBus(servletConfig);

Bus bus = getBus();
 BusFactory.setDefaultBus(bus);

createFactoryBean();
 }

private void createFactoryBean() {
 JaxWsServerFactoryBean fb = new JaxWsServerFactoryBean();
 fb.setWsdlLocation("myservice.wsdl");
 fb.setAddress("/");
 fb.setServiceBean(new MyServicePortImpl());
 fb.setServiceClass(MyServicePort.class);
 fb.setServiceName(new QName("http://www.example.com/MyService", "MyService"));
 fb.create();
 }
}

Fuentes:
http://cxf.apache.org/docs/26-migration-guide.html
http://cxf.apache.org/docs/jaxrs-services-configuration.html
http://cxf.apache.org/docs/jax-rs.html#JAX-RS-Projectsetupandconfiguration
http://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html
http://www.mkyong.com/spring/spring-error-classnotfoundexception-org-springframework-web-context-contextloaderlistener/
http://www.axlrosen.net/stuff/cxf-without-spring.html