gradle이 설치되지 않은 경우 실행이 가능하도록 실행스크립트를 더해줍니다. build.gradle 파일에 gradle의 버전을 지정합니다.


task wrapper(type: Wrapper) {

    gradleVersion = '1.8'

}


위 내용이 추가되면 gradle wrapper 라는 명령으로 빌드스크립트를 생성합니다. gradlew 파일이 생성됩니다. 윈도우용과 리눅스용이 같이 생깁니다.

gradle wrapper

:wrapper


BUILD SUCCESSFUL


Total time: 4.893 secs


├── gradle

│   └── wrapper

│       ├── gradle-wrapper.jar

│       └── gradle-wrapper.properties

├── gradlew

├── gradlew.bat

└── src

    └── main

        └── java

            └── hello

                ├── Greeter.java

                └── HelloWorld.java



만들어진 gradlew 파일을 실행하면 다음과 같습니다.


./gradlew build

Downloading http://services.gradle.org/distributions/gradle-1.8-bin.zip

..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

Unzipping /Users/kenu/.gradle/wrapper/dists/gradle-1.8-bin/vruqmccc8532n7gr46qavsii8/gradle-1.8-bin.zip to /Users/kenu/.gradle/wrapper/dists/gradle-1.8-bin/vruqmccc8532n7gr46qavsii8

Set executable permissions for: /Users/kenu/.gradle/wrapper/dists/gradle-1.8-bin/vruqmccc8532n7gr46qavsii8/gradle-1.8/bin/gradle

:compileJava

:processResources UP-TO-DATE

:classes

:jar

:assemble

:compileTestJava UP-TO-DATE

:processTestResources UP-TO-DATE

:testClasses UP-TO-DATE

:test UP-TO-DATE

:check UP-TO-DATE

:build


BUILD SUCCESSFUL


Total time: 20.926 secs


참고: http://spring.io/guides/gs/gradle/#build-your-project-with-gradle-wrapper

gradle로 자바 빌드하기 1/2 

위 글에 이어집니다.


HelloWorld.java를 다음과 같이 수정합니다.

package hello;


import org.joda.time.LocalTime;


public class HelloWorld {

  public static void main(String[] args) {

    LocalTime currentTime = new LocalTime();

    System.out.println("The current local time is: " + currentTime);


    Greeter greeter = new Greeter();

    System.out.println(greeter.sayHello());

  }

}


joda의 LocalTime 클래스를 사용합니다.

이 상태에서 gradle build 를 실행하면 다음과 같은 에러 메시지를 만나게 됩니다.

gradle build

:compileJava

/Users/kenu/tmp/gradle-start/src/main/java/hello/HelloWorld.java:3: error: package org.joda.time does not exist

import org.joda.time.LocalTime;

                    ^

/Users/kenu/tmp/gradle-start/src/main/java/hello/HelloWorld.java:7: error: cannot find symbol

    LocalTime currentTime = new LocalTime();

    ^

  symbol:   class LocalTime

  location: class HelloWorld

/Users/kenu/tmp/gradle-start/src/main/java/hello/HelloWorld.java:7: error: cannot find symbol

    LocalTime currentTime = new LocalTime();

                                ^

  symbol:   class LocalTime

  location: class HelloWorld

3 errors

:compileJava FAILED


FAILURE: Build failed with an exception.


* What went wrong:

Execution failed for task ':compileJava'.

> Compilation failed; see the compiler error output for details.


* Try:

Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.


BUILD FAILED


Total time: 3.239 secs


build.gradle 파일에 필요한 jar 파일을 명시합니다.

apply plugin: 'java'


repositories { mavenCentral() }

dependencies {

  compile "joda-time:joda-time:2.2"

}


다시 gradle build 를 실행하면 joda-time-2.2.jar 파일을 인터넷을 통해 maven central 저장소에서 자동으로 다운로드 받아서 빌드합니다.

gradle build

:compileJava

Download http://repo1.maven.org/maven2/joda-time/joda-time/2.2/joda-time-2.2.pom

Download http://repo1.maven.org/maven2/joda-time/joda-time/2.2/joda-time-2.2.jar

:processResources UP-TO-DATE

:classes

:jar

:assemble

:compileTestJava UP-TO-DATE

:processTestResources UP-TO-DATE

:testClasses UP-TO-DATE

:test UP-TO-DATE

:check UP-TO-DATE

:build


BUILD SUCCESSFUL


Total time: 7.106 secs


maven과 다르게 로컬에 jar를 관리하는 폴더는 .m2가 아닌 .gradle 폴더입니다.

./.gradle/caches/artifacts-26/filestore/joda-time/joda-time/2.2/jar/a5f29a7acaddea3f4af307e8cf2d0cc82645fd7d/joda-time-2.2.jar


행복하세요.




빌드도구 Maven의 시스템을 그대로 사용하는 gradle은 IDE보다 command로 먼저 학습하는 것이 좋습니다.

http://spring.io/guides/gs/gradle/#scratch


문서가 아주 쉽게 잘 나왔네요.


시작은 아주 간단합니다.


1. gradle 설치

http://www.gradle.org

사이트에서 다운로드 받은 뒤에 적당한 곳(예, C:\java\gradle-1.8)에 압축을 풀고 %JAVA_HOME%\bin; 처럼 C:\java\gradle-1.8\bin; 을 시스템 환경변수 Path 에 추가합니다.

cmd 창을 새로 열어서 gradle 명령어가 동작하는지 확인합니다.


2. 자바 소스 컴파일

다음과 같은 구조의 자바파일 두 개가 있다고 합시다. Maven과 구조가 같죠. 첨부한 파일 압축을 풀면 됩니다.

gradle-start.zip


.

├── build.gradle

└── src

    └── main

        └── java

            └── hello

                ├── Greeter.java

                └── HelloWorld.java


프로젝트 최상단 폴더에 build.gradle 이라는 파일을 만들고 그 내용에 한 줄만 넣으면 됩니다.

apply plugin: 'java'


이제 컴파일하는 절차만 남았습니다.

gradle build

:compileJava

:processResources UP-TO-DATE

:classes

:jar

:assemble

:compileTestJava UP-TO-DATE

:processTestResources UP-TO-DATE

:testClasses UP-TO-DATE

:test UP-TO-DATE

:check UP-TO-DATE

:build


BUILD SUCCESSFUL


Total time: 4.677 secs


gradle build 라고 입력하면 자동으로 컴파일합니다.


.

├── build

│   ├── classes

│   │   └── main

│   │       └── hello

│   │           ├── Greeter.class

│   │           └── HelloWorld.class

│   ├── dependency-cache

│   ├── libs

│   │   └── gradle-start.jar

│   └── tmp

│       └── jar

│           └── MANIFEST.MF


다음과 같이 실행해 볼 수 있겠죠.

java -cp build/libs/gradle-start.jar hello.HelloWorld


또는 class를 직접 실행할 수 있습니다.

java -cp build/classes/main hello.HelloWorld


jar파일이 필요한 것은 다음 글에서 정리해 보겠습니다.


gradle로 자바 빌드하기 2/2

윈도우에서 찾아 엄청 헤맸는데,

그냥 크롬브라우저로 해결 됩니다.


<html>

  <body>

    <video src="" id="myvideo"  autoplay></video>

    <script type="text/javascript">

      var video = document.getElementById('myvideo');

      navigator.webkitGetUserMedia({video:true}, success); 

    

      function success(stream){

        video.src = window.webkitURL.createObjectURL(stream);

      }

    </script>

  </body>

</html>


from: http://hanury.net/wp/archives/3479





구글맵을 하기 위해서 거쳐야 하는 apikey 작업이 바뀌었군요.

maps.jar도 Google Play Services 패키지 안에 포함되었구요. 

GCM(Google Cloud Messaging)도 [Deprecated] 딱지가 붙고, 이것도 Google Play Services로 포함되었습니다.

더 파고 들어가 봐야겠습니다.

일단 구글맵 v2 먼저 정리하신 분 블로그 링크겁니다.

http://pppdw.tistory.com/entry/GoogleMap-API-v2-띄워-볼까요



아주 쉬운 퀴즈 10문제(주관식 2 포함) 입니다.


goo.gl/cwEVYJ


정답은 등록하신 이메일로 보내드립니다.

한참을 삽질했습니다. 구글링을 해보니 mac의 jdk와 호환이 되지 않아서 발생하는 문제라고 합니다.

http://stackoverflow.com/questions/17822795/google-app-engine-javax-servlet-unavailableexception-initialization-failed#comment27168122_17822795


역시나 윈도우 가상머신에 GAE 개발환경 갖추고 실행하니 같은 소스가 잘 동작합니다.



다음은 앱엔진 로그에 나타나는 메시지입니다.

  1. 2013-10-15 16:22:29.386 / 500 5066ms 0kb Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/536.30.1 (KHTML, like Gecko) Version/6.0.5 Safari/536.30.1
    210.98.50.4 - - [15/Oct/2013:16:22:29 -0700] "GET / HTTP/1.1" 500 0 - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/536.30.1 (KHTML, like Gecko) Version/6.0.5 Safari/536.30.1" "1.okgawi.appspot.com" ms=5067 cpu_ms=2567 loading_request=1 app_engine_release=1.8.6 instance=00c61b117cc605edbcad33f6d430edbd601896
  2. W2013-10-15 16:22:29.299
    EXCEPTION 
    java.lang.IllegalArgumentException
    	at com.google.appengine.runtime.Request.process-3c18ce8f0ef50d07(Request.java)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:360)
    	at org.mortbay.util.Loader.loadClass(Loader.java:91)
    	at org.mortbay.util.Loader.loadClass(Loader.java:71)
    	at org.mortbay.jetty.servlet.Holder.doStart(Holder.java:73)
    	at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:242)
    	at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    	at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
    	at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
    	at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
    	at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
    	at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
    	at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    	at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:435)
    	at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:442)
    	at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:186)
    	at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:306)
    	at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:298)
    	at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:439)
    	at java.lang.Thread.run(Thread.java:724)
    
  3. E2013-10-15 16:22:29.376
    javax.servlet.ServletContext log: unavailable
    javax.servlet.UnavailableException
    	at org.mortbay.jetty.servlet.Holder.doStart(Holder.java:79)
    	at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:242)
    	at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    	at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
    	at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
    	at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
    	at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
    	at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
    	at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    	at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.createHandler(AppVersionHandlerMap.java:219)
    	at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.getHandler(AppVersionHandlerMap.java:194)
    	at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:134)
    	at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:446)
    	at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:435)
    	at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:442)
    	at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:186)
    	at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:306)
    	at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:298)
    	at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:439)
    	at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251)
    	at java.lang.Thread.run(Thread.java:724)
    
  4. W2013-10-15 16:22:29.380
    Failed startup of context com.google.apphosting.utils.jetty.RuntimeAppEngineWebAppContext@1d9525e{/,/base/data/home/apps/s~okgawi/1.370945407503011368}
    java.lang.NullPointerException
    	at java.lang.Class.isAssignableFrom(Native Method)
    	at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:256)
    	at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    	at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
    	at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
    	at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
    	at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
    	at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
    	at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    	at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.createHandler(AppVersionHandlerMap.java:219)
    	at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.getHandler(AppVersionHandlerMap.java:194)
    	at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:134)
    	at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:446)
    	at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:435)
    	at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:442)
    	at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:186)
    	at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:306)
    	at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:298)
    	at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:439)
    	at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251)
    	at java.lang.Thread.run(Thread.java:724)



쉬운 게 없군요.


HW > OS > JVM > Spring 을 만들고 있다는 생각. 애플리케이션 컴포넌트들을 만들고 레고처럼 조립하게 만드는 방향으로 가는 듯 합니다. IoC, PSA 덕분에 조립하기가 쉬운 프레임워크이니까요.

문서화가 약하다는 오픈소스의 편견을 깬 문서 목록입니다. 미친 속도입니다.

http://spring.io/docs


Spring Projects

Projects in Incubation

Projects in the Attic

스프링 웹MVC로 코드 만들어 실행할 때 WAR로 빌드해서 톰캣 설치된 곳에 복사해서 실행하지 않아도 되는 세상입니다. 빌드 도구를 통해서 톰캣 관련 jar 다운받아서 바로 실행할 수 있게 되어 있으니까요.


라고 생각했었습니다. mvn 쓸 때까지는요.


스프링 한 술 더 뜨네요.


package hello;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan;

@ComponentScan
@EnableAutoConfiguration
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

이러면 서버가 뜹니다.

자바 공부할 때 흔히 보던 main() 메소드로 말이죠.


Download http://repo1.maven.org/maven2/org/apache/tomcat/embed/tomcat-embed-core/7.0.42/tomcat-embed-core-7.0.42.jar

Download http://repo1.maven.org/maven2/org/apache/tomcat/embed/tomcat-embed-logging-juli/7.0.42/tomcat-embed-logging-juli-7.0.42.jar

빌드에서 확인한 파일입니다.


관련 글입니다. 아래 문서는 spring-boot 를 사용합니다.

http://spring.io/guides/gs/serving-web-content/#initial




1.7.0 뿐만 아니라 다른 버전도 멈춰서네요.

Downloading: http://maven.springframework.org/milestone/org/aspectj/aspectjtools/1.7.0.RC1/aspectjtools-1.7.0.RC1.pom

Downloaded: http://maven.springframework.org/milestone/org/aspectj/aspectjtools/1.7.0.RC1/aspectjtools-1.7.0.RC1.pom (862 B at 1.2 KB/sec)

Downloading: http://maven.springframework.org/release/org/aspectj/aspectjtools/1.7.0.RC1/aspectjtools-1.7.0.RC1.jar

Downloading: http://maven.springframework.org/milestone/org/aspectj/aspectjtools/1.7.0.RC1/aspectjtools-1.7.0.RC1.jar

390KB

^C

망을 바꿔서 다시 시도하니 됩니다.

kenuui-Retina-MacBook-Pro:petclinic kenu$ mvn package

[INFO] Scanning for projects...

[INFO]

[INFO] ------------------------------------------------------------------------

[INFO] Building petclinic 0.1.0.BUILD-SNAPSHOT

[INFO] ------------------------------------------------------------------------

[INFO]

[INFO] --- aspectj-maven-plugin:1.2:compile (default) @ petclinic ---

Downloading: http://maven.springframework.org/milestone/org/aspectj/aspectjtools/1.7.0.RC1/aspectjtools-1.7.0.RC1.jar

+ Recent posts