Giter Site home page Giter Site logo

aol / micro-server Goto Github PK

View Code? Open in Web Editor NEW
939.0 125.0 216.0 8.13 MB

Microserver is a Java 8 native, zero configuration, standards based, battle hardened library to run Java Rest Microservices via a standard Java main class. Supporting pure Microservice or Micro-monolith styles.

Home Page: http://micro-server.io/

License: Apache License 2.0

Java 99.81% Groovy 0.19%
microservices rest jersey spring spring-boot plugins

micro-server's Introduction

Microserver

Build Status Join the chat at https://gitter.im/aol/micro-server

A convenient modular engine for Microservices. Microserver plugins offer seamless integration with Spring (core), Jersey, Guava, Tomcat, Grizzly, reactive programming, Hibernate (& Spring Data), Spring Boot, Codahale Metrics, Swagger and more to come!

screen shot 2016-05-06 at 12 30 26 pm

Microserver plugins video

Getting started video

Quick start

Install Microserver with Grizzly, Jackson and Jersey (Gradle config below)

    compile group: 'com.oath.microservices', name:'micro-grizzly-with-jersey', version:'x.yz'

Install Microserver with Tomcat, Jackson and Jersey (Gradle config below)

   compile group: 'com.oath.microservices', name:'micro-tomcat-with-jersey', version:'x.yz'    

Create and run a simple app

   @Rest
   @Path("/test")
   public class SimpleApp {

   	public static void main(String[] args){
   		new MicroserverApp(()->"test-app").run();
   	}
   	@GET
   	public String myEndPoint(){
   		return "hello world!";
   	}
   }

Browse to http://localhost:8080/test-app/test

See the response hello world!

Add plugins by adding them to your build file - rerun the app to get new end points, Spring beans and more!

Easy to use async NIO based REST

Return any reactive-streams Publisher from your REST end point to make them execute asynchronously automatically.

E.g. Using Future from cyclops-react

   @GET
   public Future<String> myEndPoint(){
          return Future.of(()->{
                                        sleep();
                                        return "hello world!";
                                        }, Executors.newFixedThreadPool(1));
   }

Would be equivalent to the following code

 @GET
 public void myEndPoint(@Suspended AsyncResponse asyncResponse){
      Future.of(()->{
                                           sleep();
                                           asyncResponse.resume("hello world!");
                                           return 1;
		}, Executors.newFixedThreadPool(1));
}

Why Microserver?

Microserver is a plugin engine for building Spring and Spring Boot based microservices. Microserver supports pure microservice and micro-monolith development styles. The micro-monolith style involves packaging multiple services into a single deployment - offering developers the productivity of microservice development without the operational risk. This can help teams adopt a Microservices architecture on projects that are currently monoliths.

Microserver plugins are orthogonal to Microservices. They solve a common problem in Microservice development whereby services are broken up and deployed separately but the code remains entangled in a monolithic common library. By making use of a plugin system that follows the same modular architectural principals as microservice development, teams can keep cross-service concerns and infrastructure in properly size, coherent and cohesive plugin modules.

Tutorial and overview

Tutorial

Tutorial code

Note on Fat Jars

Microserver (& Cyclops) have a plugin architecture and make use of the Java Service Loader mechanism. Make sure your Fat Jar implementation is configured to aggregate services. With the Gradle Shadow Jar you do this with

   shadowJar {
     mergeServiceFiles()
   }

Quick start youtube video

Getting started video

Note the main launch class has been changed from MicroServerStartup to MicroserverApp

Blurb

Microserver is a zero configuration, standards based, battle hardened library to run Java Rest Microservices via a standard Java main class. It has been used in production in AOL since July 2014.

Get Microserver

Build health

  • micro-grizzly-with-jersey Maven Central
  • micro-tomcat-with-jersey Maven Central
  • micro-core Maven Central
  • micro-boot : Microserver driving Spring Boot Maven Central
  • micro-spring-boot : Spring Boot driving Microserver Maven Central

Info

wiki

Google Group

Example Apps : Microserver Core with Grizzly and Jersey

Example Apps : Microserver Boot

Java Doc : Microserver Core

Java Doc : Microserver Boot

Maven dependency

Microserver Grizzly with Jersey

   <dependency>
     <groupId>com.oath.microservices</groupId>
     <artifactId>micro-grizzly-with-jersey</artifactId>
     <version>x.yz</version>
   </dependency>

Microserver Spring Boot

   <dependency>
     <groupId>com.oath.microservices</groupId>
     <artifactId>micro-spring-boot</artifactId>
     <version>x.yz</version>
   </dependency>

Gradle dependency

Microserver core

    compile group: 'com.oath.microservices', name:'micro-core', version:'x.yz'

Microserver Spring Boot

     compile group: 'com.oath.microservices', name:'micro-spring-boot', version:'x.yz'

Tech Stack

Microserver core is a lightweight server configuration engine built using Spring, Cyclops and Jackson.

Zero Configuration

No directory structure is imposed by the server and no XML is required. There is no framework config. Just a jar file and your application. You can, of course, configure your application without limit.

Example working application :-

The main class :-

     public class AppRunnerTest {

		
		public static void main(String[] args) throws InterruptedException {
			new MicroserverApp(() -> "test-app").run();
		}

    }

This will deploy a REST server on port 8080 (configurable by test-app.port in application.properties), it will also automagically capture any Rest end points (Spring & Jersey annotations) that implement the tag interface RestResource (see below for an example).

A rest end point

@Rest
@Path("/status")
public class StatusResource {

    @GET
    @Produces("text/plain")
    @Path("/ping")
    public String ping() {
        return "ok";
    }

}

Configuration Options

If you find you need configuration options for your application you have two options.

  1. Override some of the available options on the Module interface (ConfigurableModule provides a builder mechanism for this)
  2. Implement a custom plugin (the cleanest option, which also promotes reuse across services).

Application configuration (for Grizzly with Jersey)

The core of Microserver is a Spring 4.x Dependency Injection container which is used to store all the main classes of your Microservice (s). The Spring Dependency Injection container can be configured by the @Microservice Annotation on your main class, or by the Config object (optionally passed as a parameter to startup).

Micro-monolith Architectural Overview

Each Microservice is a Jersey REST Application, these can be deployed independently as pure Microservices or together as a micro-monolith. Multiple Microservices can run on the same server, by adding them to the classpath at runtime. They share a common Spring Dependency Injection container (as they are smaller services, we feel it makes sense to share resources such as ThreadPools, Datasources etc), but act as totally separate Rest applications.

When creating embedded Microservices (multiple services colocated on the same JVM and Spring container), the development project should be independent, but the colocated instances should be tested as they will be deployed in production. There will be more info to follow on the wiki, on how and why we have implemented and scaled this pattern (the goal is to achieve both the benefits of a full Microservice architecture, but minimise the costs as articulated by Robert (Uncle Bob) C. Martin and others - e.g. here: Microservices and Jars .

Jersey REST Applications are configured by the Module interface (at least one of which must be specified on startup).

high level architecture

Rest configuration

The configuration of your Rest endpoints can be managed via the Module interface. The Module interface has a number of Java 8 default methods and a single abstract method (getContext). It behaves as a functional interface, and can be defined by a lambda expression. When used in this way the lambda represents the context the Microserver will create Rest end points on.

e.g.

   new MicroserverApp(() -> "context").start();

() -> "context" is a Module!

Configurable Options

Module provides the following default methods, that clients can override

   default Map<String,String> getPropertyOverrides(){
   	return Maps.newHashMap();
   }
   default Set<Class> getSpringConfigurationClasses(){
   	return Sets.newHashSet(Classes.CORE_CLASSES.getClasses());
   }
   default List<Class> getRestResourceClasses() {
   	return Arrays.asList(RestResource.class);
   }
   default List<Class> getRestAnnotationClasses() {
   	return Arrays.asList(Rest.class);
   }
   
   default List<String> getDefaultJaxRsPackages(){
   	return Arrays.asList("com.wordnik.swagger.sample.resource",
   			"com.wordnik.swagger.sample.util"	);
   }
   
   default List<Class> getDefaultResources(){
   	return Arrays.asList(JacksonFeature.class, 
   			//SWAGGER CLASSES
   			ApiListingResourceJSON.class,JerseyApiDeclarationProvider.class,
   			JerseyResourceListingProvider.class);
   }
   
   default List<ServletContextListener> getListeners(ServerData data){
   	return ImmutableList.of(new ContextLoaderListener(data
   			.getRootContext()),
   			new JerseySpringIntegrationContextListener(data),
   			new SwaggerInitializer(data));
   }
   default Map<String,Filter> getFilters(ServerData data) {
   	return ImmutableMap.of("/*",new QueryIPRetriever());
   }
   default Map<String,Servlet> getServlets(ServerData data) {
   	return ImmutableMap.of();
   }
   
   default  String getJaxWsRsApplication(){
   	return JerseyRestApplication.class.getCanonicalName();
   }
   default String getProviders(){
   	return "com.aol.micro.server.rest.providers";
   }

RestResource class defines the tag interface used to identify Rest end points for this module.

Filters provides a map of Servlet filters and the paths to which they should be applied

Providers allows client code to change the Jersey Providers packages

JaxWsRsApplication allows client code to completely override the Microserver jax.ws.rs.Application

Property file configuration

Microserver supports auto-discovery of application.properties. Microserver will assume a default file name of 'application.properties'. Microserver will check for a properties in the following order

  1. System property 'application.property.file' and if present will load the property file from disk using that.

  2. Otherwise, Microserver will look for a System Property 'application.env' and will load the application property file from the classpath using the resource name 'application-${application.env}.properties.

  3. Alternatively, Microserver will load application.properties directly from the classpath.

  4. If still not found Microserver will load application.properties from disk in the current directory

The default file name application.properties can be configured by exception (use PropertyFileConfig.setApplicationPropertyFileName(String filename).

Microserver application properties loading is configured by the class PropertyFileConfig. You can replace this with your own Spring configuration file to load property files by a different set of rules (by passing in your class to the constructor of Microserver).

Embed and colocate Microservices

Microserver supports the embedding of multiple microservices within a single Microserver, this is not the default mode of operation and involves a little more work to setup. All Microservices will share a single Spring context, so some care needs to be taken when authoring such Microservices to avoid conflicts. This does mean that they can share resources (such as database connections) where it makes sense to do so.

Embedded microservices should be collated at '''runtime only'''. There should be no compile time dependency between embedded microservices (otherwise you are not building microservices but a monolithic application).

Embedding microservices is an optimisation that allows better performance, enhanced robustness and reliability and easier management of microservices - while still maintaining the advantages of horizontal scalability offered by the microservices approach.

Embedded Microservices example

This example will start two different Rest endpoints - one on context "test-app" and another on context "alternative-app". "test-app" will automagically wire in any Jersey endpoints that implement TestAppRestResource. "alternative-app" will automagically wire in any Jersey endpoints that implement AltAppRestResource.

   @Microserver
   public class EmbeddedAppRunnerTest {
   
   	public static void main(String[] args) throws InterruptedException {
   		new MicroserverApp(EmbeddedAppRunnerTest.class, 
   				new EmbeddedModule(TestAppRestResource.class,"test-app"),
   				new EmbeddedModule(AltAppRestResource.class,"alternative-app")).start();
   	
   		
   	
   	}
   }

Building a 'fat' Jar

We recommend the Gradle plugin Shadow Jar. For Gradle 2.0 simply define it in your plugins section ->

plugins {
 id 'java' // or 'groovy' Must be explicitly applied
 id 'com.github.johnrengelman.shadow' version '1.2.0'
}

Maven users can use Shade plugin or equivalent (Maven assembly plugin).

Thanks to our Sponsors

micro-server's People

Contributors

arunbcodes avatar bryant1410 avatar danesfort avatar davidartplus avatar djgarcias avatar earlzero avatar edeegan avatar gitter-badger avatar jijisv avatar johnmcclean avatar kewangie avatar kybut avatar marcocast avatar morrowgi avatar oldratlee avatar philip-clarke avatar pvorb avatar quike avatar ramswaroop avatar tonyfinn avatar wwfifi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

micro-server's Issues

typo in pom.xml leads to not being able to build Eclipse project

In the pom.xml hosted on Maven central, the dependency for jackson-jaxrs-providerhas a typo:

com.fasterxml.jackson.jaxrs
jackson-jaxrs-providers
^^
The artifactId should be 'jackson-jaxrs-provider' - Eclipse shows an error:
Missing artifact com.fasterxml.jackson.jaxrs:jackson-jaxrs-providers:jar:2.2.3

Could someone fix this and upload a new pom to Maven central? TIA (thanks-in-advance)

swagger-ui: basePath or apiPath?

I'm trying to get swagger-ui to work without much success - in
applications.properties do I need to specify swagger-ui's basePath or apiPath?

CORs module needs enhanced

Current CORs filter, is pretty basic (wrt features & configurability). A more advanced one should be pluggable also (perhaps the ebay CORs Filter).

Make host name configurable for application registry

Add a property (application or system) called host.address that overrides the value returned from InetAddress.getLocalHost().getHostName() for senders IP Address.

InetAddress.getLocalHost().getHostName() doesn't work inside Docker containers

micro-events : SystemData should include the correlation id

SystemData captures metrics for active jobs. The correlation id past into ActiveEvents is not stored on SystemData, so any subscribers to the jobs Guava EventBus can't correlate back the exact event triggered.

Correlation id should be included in SystemData.

micro-log4j plugin

Many 3rd party projects use log4j - we've seen issues where by a third party library automatically changes log4j logging level.

This plugin will allow admins to reset the log level - either periodically or via a rest interface.

RestAnnotationClasses not available in ConfigurableModule

Per the docs for the most recent micro-server, a way to add annotation classes should be available in ConfigurableModule:

default List getRestAnnotationClasses() {
return Arrays.asList(Rest.class);
}

However, as of micro-server-0.5.8, there doesn't appear to be any way to add annotation classes via ConfigurableModule:

https://github.com/aol/micro-server/blob/master/micro-core/src/main/java/com/aol/micro/server/module/ConfigurableModule.java

Reactive Microserver : Allow inter thread communication via Queues & Topics

Make use simple-reacts support for Streaming from async Queues and Topics.

E.g. we can register a Queue and get back an infinite LazyFutureStream.

 LazyFutureStream<String> logInfo = Pipes.registerQueue(LOG_LEVEL, 
                                            QueueFactories.   <String>boundedNonBlockingQueue(1000)
                                            .build());


    logInfo.pollStrategy(SPIN_WAIT).peek(this::updateLogLevel).run();

In our Rest Resources we can enqueue data to be processed and return immediately (if desired) e.g.

 this.enqueue(LOG_LEVEL, "DEBUG");

micro-events : Query events identifier should not use processing thread id

Query events identifier should not use processing thread id as this means the query start & end events can't be executed by separate threads.

e.g.

bus.post(RequestEvents.start(query, correlationId,"standard-query",HashMapBuilder.of("ip",QueryIPRetriever.getIpAddress())));
         this.restClient.withAccept(ACCEPT_HEADERS)
                        .withContentType(CONTENT_TYPE)
                        .withResponse(Result.class)
                        .post(apiURL,query)
                        .thenAccept(action->asyncResponse.resume(action))
                        .thenAccept( action->bus.post(RequestEvents.finish(query, correlationId)));

This won't close the event properly on completion as the completion event occurs asynchronously

JacksonUtil not working in version 0.62

The previous com.aol.micro.server.rest.JacksonUtil has been replaced by com.aol.micro.server.rest.jackson.JacksonUtil, but when running a simple json conversion (working with 0.59) I get the following error :

java.lang.NoClassDefFoundError: com/aol/cyclops/lambda/monads/SequenceM
at com.aol.micro.server.PluginLoader.load(PluginLoader.java:21)
at com.aol.micro.server.PluginLoader$$Lambda$1/1282287470.get(Unknown Source)
at com.aol.cyclops.lambda.utils.LazyImmutable.setOnceFromSupplier(LazyImmutable.java:116)
at com.aol.cyclops.lambda.utils.LazyImmutable.computeIfAbsent(LazyImmutable.java:133)
at com.aol.cyclops.functions.Memoise.lambda$memoiseSupplier$109(Memoise.java:27)
at com.aol.cyclops.functions.Memoise$$Lambda$2/2104028992.get(Unknown Source)
at com.aol.micro.server.rest.jackson.JacksonUtil.getMapper(JacksonUtil.java:39)
at com.aol.micro.server.rest.jackson.JacksonUtil.serializeToJson(JacksonUtil.java:63)
at com.ucd.geoservices.model.QueryRadiusRequestTest.testJson(QueryRadiusRequestTest.java:36)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.lang.ClassNotFoundException: com.aol.cyclops.lambda.monads.SequenceM
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 32 more

Is cyclops already part of the micro-server-core?

Variable substitution in properties is not being picked up by microserver

During installation of components using microserver. It is often nesecery to use command line variables to set log directories. In one such instance is the access logs. So currently micoroserver picks these up from the following property access.log.output.

If i initialize a variable in the start script for example like so:

export MY_APP=sample_microserver

If I add this property as follows:

access.log.output:/data/servers/${MY_APP}/logs/

The MY_APP variable does not get interpolated as sample_microserver.

Workaround is to hard code the access log location in the properties provided to the microservice

Create a 3-tier hierachial property file loading structure

  • instance properties override (instance.properties)
  • service type properties override (service-type.properties - use Microserver annotation to rename)
  • global properties (application.properties)

Each should be loadable from file system or classpath, with filename being set either via Microserver annotation or System property.

beanvalidator conflict with Hibernate 5 / JBoss Logging

'org.glassfish.hk2.external:bean-validator:2.4.0-b31' has it's own internal version of JBoss Logging that conflicts with

org.jboss.logging:jboss-logging:3.30 used in Hibernate 5. This results in exceptions when Hibernate attempts to access newer logging methods such as

  Caused by: java.lang.NoSuchMethodError: org.jboss.logging.Logger.debugf(Ljava/lang/String;I)V 

microserver-boot pom has incorrect dependency

Having some issues with microservice boot dependencies. Looks like the generated pom for the microservices-boot is messed up. Namely it references

micro-server micro-core 0.52 compile

So when I attempt to use the shadow / application plugin I get the following error.

FAILURE: Build failed with an exception.

  • What went wrong:

Could not resolve all dependencies for configuration ':runtime'.

Could not find micro-server:micro-core:0.52.

It should be

com.aol.microservices microserver-core 0.52

etc...

Can't make it work in a Groovy script

Hi!

This looks like a very nice project. By its simplicity I started trying to write a Groovy script but couldn't make it work due to the lambda used on the init method.

I tried something like this:

@Grab('com.aol.microservices:micro-core:0.62')

import com.aol.micro.server.*
import com.aol.micro.server.auto.discovery.*
import javax.ws.rs.*

@Rest
@Path("/status")
class StatusApp {

    static void main(String[] args){
        def init = { -> "status-app"}
        def app = new MicroserverApp(init)
        // also tried like this
        //def app = new MicroserverApp({ -> "status-app" })
        app.run()
    }

    @GET
    @Produces("text/plain")
    @Path("/ping")
    String respondToPing() {
        return "pong!"
    }
}

I know this is probably related to how Groovy handles Java 8 lambdas (I've been Googling but can not find a way to use a Groovy closure as a Java lambda for this case). What would be the best approach to make this script work?

Any help or pointers in the right direction would be very appreciated.

Thanks

Reactive Microserver : Make simple-react available on Rest resource handlers

E.g. allow simple-react to handle incoming responses via sync / async methods on the RestResource interface.

sync will execute all simple-react tasks on a single thread (more performant), async will allow multiple threads to be used (equivalent to simple-react sync / async operators)

    @GET
@Produces("application/json")
@Path("/jobs")
public void activeJobs(@Suspended AsyncResponse asyncResponse) {

    this.sync(react-> react.of(this.activeJobs)
                              .then(JobsBeingExecuted::toString)
                              .then(str->asyncResponse.resume(str)))
                              .run();

}

This Rest Resource returns the calling thread to the server immediately and responds asynchronously using simple-react. Is totally non-blocking.

simple-react should elastically scale up required number of Executors (Elastic Pools mechanism).

micro-reactive

Give option to connect to Pipes via Reactive Streams subscribers & publishers.

Support direct connect for jdk 8 Stream and Cyclops SequenceM

Wrong Gradle Shadow Plugin version

Current version is causing the eclipse gradle plugin to fail see example below:

FAILURE: Build failed with an exception.

  • Where:
    Build file 'C:\repositories\micro-server\build.gradle' line: 15

  • What went wrong:
    A problem occurred evaluating root project 'micro-server'.

    Failed to apply plugin [id 'com.github.johnrengelman.shadow']
    No signature of method: com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar_Decorated.getManifest() is applicable for argument types: () values: []
    Possible solutions: getManifest(), getManifest(), getManifest(), setManifest(org.gradle.api.java.archives.Manifest), setManifest(org.gradle.api.java.archives.Manifest), manifest(groovy.lang.Closure)

  • 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: 1.122 secs

I fixed myself changing to the current version recommended on the wiki fo the project repository

https://github.com/johnrengelman/shadow to

classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.0'

and worked well

WrongMethodTypeException: cannot convert MethodHandle(Object)Optional to (Object,Object)Object

Hi,

I am in the process of upgrading to version 0.62.

at startup, I'm calling JacksonUtil.getMapper() which causes this failure in cyclops.
stack trace below.

When I comment out the getMapper, I get a similar failure when getDefaultJaxRsPackage() is called.

Have you seen this before, or any ideas ?

Exception in thread "main" java.lang.invoke.WrongMethodTypeException: cannot convert MethodHandle(Object)Optional to (Object,Object)Object
at java.lang.invoke.MethodHandle.asTypeUncached(MethodHandle.java:776)
at java.lang.invoke.MethodHandle.asType(MethodHandle.java:770)
at java.lang.invoke.Invokers.checkGenericType(Invokers.java:366)
at com.aol.cyclops.lambda.api.InvokeDynamic.executeMethod(InvokeDynamic.java:106)
at com.aol.cyclops.lambda.api.InvokeDynamic.execute(InvokeDynamic.java:60)
at com.aol.cyclops.lambda.api.InvokeDynamic.lambda$execute$119(InvokeDynamic.java:44)
at com.aol.cyclops.lambda.api.InvokeDynamic$$Lambda$39/149047107.apply(Unknown Source)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.Spliterators$ArraySpliterator.tryAdvance(Spliterators.java:958)
at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:529)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:516)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502)
at java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:152)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:464)
at com.aol.cyclops.lambda.api.InvokeDynamic.execute(InvokeDynamic.java:44)
at com.aol.cyclops.comprehensions.comprehenders.InvokeDynamicComprehender.of(InvokeDynamicComprehender.java:158)
at com.aol.cyclops.lambda.api.Comprehender.resolveForCrossTypeFlatMap(Comprehender.java:154)
at com.aol.cyclops.lambda.api.Comprehender.unwrapOtherMonadTypes(Comprehender.java:140)
at com.aol.cyclops.lambda.api.Comprehender.lambda$executeflatMap$2(Comprehender.java:92)
at com.aol.cyclops.lambda.api.Comprehender$$Lambda$31/926370398.apply(Unknown Source)
at com.aol.cyclops.comprehensions.comprehenders.InvokeDynamicComprehender.lambda$flatMap$27(InvokeDynamicComprehender.java:133)
at com.aol.cyclops.comprehensions.comprehenders.InvokeDynamicComprehender$$Lambda$36/422392391.apply(Unknown Source)
at com.aol.cyclops.comprehensions.comprehenders.FunctionExecutionInvocationHandler.invoke(FunctionExecutionInvocationHandler.java:23)
at com.sun.proxy.$Proxy3.apply(Unknown Source)
at java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:267)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:512)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at com.aol.cyclops.lambda.monads.SequenceM.forEach(SequenceM.java:1415)
at com.aol.micro.server.rest.jackson.JacksonUtil.getMapper(JacksonUtil.java:42)
at com.aol.advertising.psm.campaign.bootstrap.CampaignStartup.main(CampaignStartup.java:43)

Question : Possible API change, remove Annotations and Configurable Module

This might make application configuration simpler, and slightly more functional.

Simplest example :

  Microserver.of("my-app")
                     .run();

Example with configuration

  Microserserver.of("my-app")
                          .filters(Filter1.class,Filter2.class)
                          .resourcesFromSpring(ResourceMarker.class,ResourceMarker2.class)
                          .onPort(8080)
                          .run();

It would open up the option of exposing the internals such as the Spring Context and Jersey itself for Configuration e.g.

  Microserserver.of("my-app")
                          .configureJersey( resourceConfig -> resourceConfig.property("myProperty"));

Trying to access Jersey ResourceConfig when using micro-server

Our team is using micro-server, and I'm trying to register an annotation for us to use with our authentication solution.

Is there a way to access the ResourceConfig (in com.aol.micro.server.rest.Jersey.JerseyRestApplication.java) when using the micro-server code?

Spring seems does not like bean classes with the same name

Fox example:

In micro-mysql and micro-data plugins, we have:
com.aol.micro.server.mysql.distlock.datasource.DataSourceBuilder
com.aol.micro.server.spring.datasource.DataSourceBuilder

when both plugins appear on classpath, applications always can not find "mainDataSource" bean which should instantiated by com.aol.micro.server.spring.datasource.DataSourceBuilder

Modularise Microserver

Move all data-access into (Hibernate, JDBC, Spring Data)

Micro-data

Swagger into

Micro-swagger

Metrics into

Micro-metrics

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.