首先看一下项目代码的组织结构
├─gradle
│ └─wrapper
├─service-asset-management
│ └─src
│ └─main
│ ├─java
│ │ └─com
│ │ └─sitewhere
│ │ └─asset
│ │ ├─configuration
│ │ ├─grpc
│ │ ├─initializer
│ │ ├─messages
│ │ ├─microservice
│ │ ├─modules
│ │ │ └─wso2
│ │ │ ├─ksoap2
│ │ │ ├─scim
│ │ │ └─ws
│ │ ├─persistence
│ │ │ └─mongodb
│ │ ├─spi
│ │ │ ├─grpc
│ │ │ └─microservice
│ │ └─spring
│ └─resources
│ ├─META-INF
│ └─wsdl
├─service-batch-operations
│ └─src
│ └─main
│ ├─java
│ │ └─com
│ │ └─sitewhere
│ │ └─batch
│ │ ├─configuration
│ │ ├─grpc
│ │ ├─handler
│ │ ├─kafka
│ │ ├─messages
│ │ ├─microservice
│ │ ├─persistence
│ │ │ └─mongodb
│ │ ├─spi
│ │ │ ├─grpc
│ │ │ ├─kafka
│ │ │ └─microservice
│ │ └─spring
│ └─resources
│ └─META-INF
├─service-command-delivery
│ ├─dockerimage
│ │ └─script-templates
│ │ └─command-encoder
│ └─src
│ └─main
│ ├─java
│ │ └─com
│ │ └─sitewhere
│ │ └─commands
│ │ ├─configuration
│ │ ├─destination
│ │ │ ├─coap
│ │ │ ├─mqtt
│ │ │ └─sms
│ │ ├─encoding
│ │ │ ├─json
│ │ │ ├─protobuf
│ │ │ └─string
│ │ ├─groovy
│ │ ├─kafka
│ │ ├─messages
│ │ ├─microservice
│ │ ├─routing
│ │ ├─spi
│ │ │ ├─kafka
│ │ │ └─microservice
│ │ ├─spring
│ │ └─twilio
│ └─resources
│ └─META-INF
├─service-device-management
│ └─src
│ └─main
│ ├─java
│ │ └─com
│ │ └─sitewhere
│ │ └─device
│ │ ├─configuration
│ │ ├─grpc
│ │ ├─initializer
│ │ ├─messages
│ │ ├─microservice
│ │ ├─persistence
│ │ │ └─mongodb
│ │ ├─spi
│ │ │ ├─grpc
│ │ │ ├─initializer
│ │ │ └─microservice
│ │ └─spring
│ └─resources
│ └─META-INF
├─service-device-registration
│ └─src
│ └─main
│ ├─java
│ │ └─com
│ │ └─sitewhere
│ │ └─registration
│ │ ├─configuration
│ │ ├─kafka
│ │ ├─messages
│ │ ├─microservice
│ │ ├─spi
│ │ │ ├─kafka
│ │ │ └─microservice
│ │ └─spring
│ └─resources
│ └─META-INF
├─service-device-state
│ └─src
│ └─main
│ ├─java
│ │ └─com
│ │ └─sitewhere
│ │ └─devicestate
│ │ ├─configuration
│ │ ├─grpc
│ │ ├─kafka
│ │ ├─messages
│ │ ├─microservice
│ │ ├─persistence
│ │ │ └─mongodb
│ │ ├─presence
│ │ ├─processing
│ │ ├─spi
│ │ │ ├─grpc
│ │ │ ├─kafka
│ │ │ ├─microservice
│ │ │ └─processing
│ │ └─spring
│ └─resources
│ └─META-INF
├─service-event-management
│ └─src
│ └─main
│ ├─java
│ │ └─com
│ │ └─sitewhere
│ │ └─event
│ │ ├─configuration
│ │ ├─grpc
│ │ ├─kafka
│ │ ├─messages
│ │ ├─microservice
│ │ ├─persistence
│ │ │ ├─cassandra
│ │ │ ├─influxdb
│ │ │ └─mongodb
│ │ ├─spi
│ │ │ ├─grpc
│ │ │ ├─kafka
│ │ │ └─microservice
│ │ └─spring
│ └─resources
│ └─META-INF
├─service-event-search
│ └─src
│ └─main
│ ├─java
│ │ └─com
│ │ └─sitewhere
│ │ └─search
│ │ ├─configuration
│ │ ├─messages
│ │ ├─microservice
│ │ ├─solr
│ │ ├─spi
│ │ │ └─microservice
│ │ └─spring
│ └─resources
│ └─META-INF
├─service-event-sources
│ ├─dockerimage
│ │ └─script-templates
│ │ └─binary-decoder
│ └─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─sitewhere
│ │ │ └─sources
│ │ │ ├─activemq
│ │ │ ├─azure
│ │ │ ├─coap
│ │ │ ├─configuration
│ │ │ ├─decoder
│ │ │ │ ├─coap
│ │ │ │ ├─composite
│ │ │ │ ├─debug
│ │ │ │ ├─json
│ │ │ │ └─protobuf
│ │ │ ├─deduplicator
│ │ │ ├─kafka
│ │ │ ├─messages
│ │ │ ├─microservice
│ │ │ ├─mqtt
│ │ │ ├─rabbitmq
│ │ │ ├─rest
│ │ │ ├─socket
│ │ │ ├─spi
│ │ │ │ ├─microservice
│ │ │ │ └─socket
│ │ │ ├─spring
│ │ │ └─websocket
│ │ └─resources
│ │ └─META-INF
│ └─test
│ └─java
│ └─com
│ └─sitewhere
│ └─sources
│ ├─azure
│ └─websocket
├─service-inbound-processing
│ └─src
│ └─main
│ ├─java
│ │ └─com
│ │ └─sitewhere
│ │ └─inbound
│ │ ├─configuration
│ │ ├─kafka
│ │ ├─messages
│ │ ├─microservice
│ │ ├─processing
│ │ ├─spi
│ │ │ ├─kafka
│ │ │ ├─microservice
│ │ │ └─processing
│ │ └─spring
│ └─resources
│ └─META-INF
├─service-instance-management
│ ├─dockerimage
│ │ └─templates
│ │ └─default
│ │ ├─conf
│ │ └─scripts
│ │ └─groovy
│ │ └─initializer
│ └─src
│ └─main
│ ├─java
│ │ └─com
│ │ └─sitewhere
│ │ └─instance
│ │ ├─configuration
│ │ ├─initializer
│ │ ├─messages
│ │ ├─microservice
│ │ ├─spi
│ │ │ ├─initializer
│ │ │ ├─microservice
│ │ │ └─templates
│ │ └─templates
│ └─resources
├─service-label-generation
│ └─src
│ └─main
│ ├─java
│ │ └─com
│ │ └─sitewhere
│ │ └─labels
│ │ ├─configuration
│ │ ├─grpc
│ │ ├─messages
│ │ ├─microservice
│ │ ├─spi
│ │ │ ├─grpc
│ │ │ └─microservice
│ │ ├─spring
│ │ └─symbology
│ └─resources
│ └─META-INF
├─service-outbound-connectors
│ ├─conf
│ ├─dockerimage
│ │ └─script-templates
│ │ ├─filter
│ │ ├─outbound-connector
│ │ ├─payload-builder
│ │ └─uri-builder
│ ├─lib
│ └─src
│ └─main
│ ├─java
│ │ └─com
│ │ └─sitewhere
│ │ └─connectors
│ │ ├─aws
│ │ │ └─sqs
│ │ ├─azure
│ │ ├─configuration
│ │ ├─dweetio
│ │ ├─filter
│ │ ├─groovy
│ │ │ ├─common
│ │ │ ├─filter
│ │ │ ├─multicast
│ │ │ └─routing
│ │ ├─http
│ │ ├─initialstate
│ │ ├─kafka
│ │ ├─messages
│ │ ├─microservice
│ │ ├─mqtt
│ │ ├─rabbitmq
│ │ ├─solr
│ │ ├─spi
│ │ │ ├─common
│ │ │ ├─microservice
│ │ │ ├─multicast
│ │ │ └─routing
│ │ └─spring
│ └─resources
│ └─META-INF
├─service-rule-processing
│ └─src
│ └─main
│ ├─java
│ │ └─com
│ │ └─sitewhere
│ │ └─rules
│ │ ├─configuration
│ │ ├─kafka
│ │ ├─messages
│ │ ├─microservice
│ │ ├─processors
│ │ │ └─geospatial
│ │ ├─spi
│ │ │ └─microservice
│ │ └─spring
│ └─resources
│ └─META-INF
├─service-schedule-management
│ └─src
│ └─main
│ ├─java
│ │ └─com
│ │ └─sitewhere
│ │ └─schedule
│ │ ├─configuration
│ │ ├─grpc
│ │ ├─initializer
│ │ ├─jobs
│ │ ├─messages
│ │ ├─microservice
│ │ ├─persistence
│ │ │ └─mongodb
│ │ ├─spi
│ │ │ ├─grpc
│ │ │ ├─initializer
│ │ │ └─microservice
│ │ └─spring
│ └─resources
│ └─META-INF
├─service-streaming-media
│ └─src
│ └─main
│ ├─java
│ │ └─com
│ │ └─sitewhere
│ │ └─media
│ │ ├─configuration
│ │ ├─messages
│ │ ├─microservice
│ │ ├─persistence
│ │ │ ├─cassandra
│ │ │ ├─influxdb
│ │ │ └─mongodb
│ │ ├─spi
│ │ │ └─microservice
│ │ └─spring
│ └─resources
│ └─META-INF
├─service-tenant-management
│ ├─dockerimage
│ │ ├─datasets
│ │ │ ├─airtraffic
│ │ │ │ └─scripts
│ │ │ │ ├─asset-management
│ │ │ │ │ └─content
│ │ │ │ │ └─initializer
│ │ │ │ ├─device-management
│ │ │ │ │ └─content
│ │ │ │ │ └─initializer
│ │ │ │ └─schedule-management
│ │ │ │ └─content
│ │ │ │ └─initializer
│ │ │ ├─construction
│ │ │ │ └─scripts
│ │ │ │ ├─asset-management
│ │ │ │ │ └─content
│ │ │ │ │ └─initializer
│ │ │ │ ├─device-management
│ │ │ │ │ └─content
│ │ │ │ │ └─initializer
│ │ │ │ └─schedule-management
│ │ │ │ └─content
│ │ │ │ └─initializer
│ │ │ └─empty
│ │ └─templates
│ │ ├─cassandra
│ │ ├─default
│ │ │ └─scripts
│ │ │ └─command-delivery
│ │ │ └─command-encoder
│ │ ├─influxdb
│ │ ├─mongodb
│ │ └─stomp
│ └─src
│ └─main
│ ├─java
│ │ └─com
│ │ └─sitewhere
│ │ └─tenant
│ │ ├─configuration
│ │ ├─grpc
│ │ ├─kafka
│ │ ├─messages
│ │ ├─microservice
│ │ ├─persistence
│ │ │ └─mongodb
│ │ ├─spi
│ │ │ ├─grpc
│ │ │ ├─kafka
│ │ │ ├─microservice
│ │ │ ├─spring
│ │ │ └─templates
│ │ ├─spring
│ │ └─templates
│ └─resources
│ └─META-INF
├─service-user-management
│ └─src
│ └─main
│ ├─java
│ │ └─com
│ │ └─sitewhere
│ │ └─user
│ │ ├─configuration
│ │ ├─grpc
│ │ ├─kafka
│ │ ├─messages
│ │ ├─microservice
│ │ ├─persistence
│ │ │ └─mongodb
│ │ ├─spi
│ │ │ ├─grpc
│ │ │ └─microservice
│ │ └─spring
│ └─resources
│ └─META-INF
├─service-web-rest
│ ├─src
│ │ └─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─sitewhere
│ │ │ └─web
│ │ │ ├─annotation
│ │ │ ├─auth
│ │ │ │ └─controllers
│ │ │ ├─configuration
│ │ │ ├─filters
│ │ │ ├─messages
│ │ │ ├─microservice
│ │ │ ├─rest
│ │ │ │ ├─controllers
│ │ │ │ ├─marshaling
│ │ │ │ ├─model
│ │ │ │ └─view
│ │ │ ├─security
│ │ │ │ ├─basic
│ │ │ │ └─jwt
│ │ │ ├─spi
│ │ │ │ └─microservice
│ │ │ ├─spring
│ │ │ └─ws
│ │ │ └─components
│ │ │ └─topology
│ │ └─resources
│ │ └─META-INF
│ └─WEB-INF
├─sitewhere-cassandra
│ └─src
│ └─main
│ └─java
│ └─com
│ └─sitewhere
│ └─cassandra
├─sitewhere-communication
│ └─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─sitewhere
│ │ │ └─communication
│ │ │ ├─mqtt
│ │ │ └─protobuf
│ │ └─resources
│ └─test
│ └─java
│ └─com
│ └─sitewhere
│ └─communication
│ └─test
│ ├─coap
│ └─mqtt
├─sitewhere-configuration
│ └─src
│ └─main
│ ├─java
│ │ └─com
│ │ └─sitewhere
│ │ └─configuration
│ │ ├─content
│ │ ├─datastore
│ │ ├─instance
│ │ │ ├─cassandra
│ │ │ ├─influxdb
│ │ │ ├─mongodb
│ │ │ └─solr
│ │ ├─model
│ │ ├─old
│ │ └─parser
│ └─resources
│ └─META-INF
├─sitewhere-core
│ └─src
│ └─main
│ ├─java
│ │ ├─com
│ │ │ └─sitewhere
│ │ │ ├─asset
│ │ │ │ └─marshaling
│ │ │ ├─batch
│ │ │ │ └─marshaling
│ │ │ ├─configuration
│ │ │ ├─core
│ │ │ ├─device
│ │ │ │ ├─charting
│ │ │ │ ├─group
│ │ │ │ └─marshaling
│ │ │ │ └─invalid
│ │ │ ├─geospatial
│ │ │ ├─groovy
│ │ │ ├─persistence
│ │ │ ├─schedule
│ │ │ ├─security
│ │ │ ├─server
│ │ │ ├─tenant
│ │ │ └─user
│ │ └─META-INF
│ └─resources
│ └─META-INF
├─sitewhere-core-api
│ └─src
│ └─main
│ ├─java
│ │ └─com
│ │ └─sitewhere
│ │ ├─common
│ │ ├─rest
│ │ │ └─model
│ │ │ ├─asset
│ │ │ │ └─request
│ │ │ │ └─scripting
│ │ │ ├─configuration
│ │ │ ├─device
│ │ │ │ ├─asset
│ │ │ │ ├─event
│ │ │ │ │ └─request
│ │ │ │ │ └─scripting
│ │ │ │ └─request
│ │ │ │ └─scripting
│ │ │ ├─microservice
│ │ │ │ ├─scripting
│ │ │ │ └─state
│ │ │ ├─monitoring
│ │ │ ├─resource
│ │ │ │ └─request
│ │ │ ├─scheduling
│ │ │ │ └─request
│ │ │ │ └─scripting
│ │ │ ├─search
│ │ │ │ └─external
│ │ │ ├─tenant
│ │ │ │ └─request
│ │ │ │ └─scripting
│ │ │ └─user
│ │ │ └─request
│ │ └─spi
│ │ ├─asset
│ │ ├─batch
│ │ ├─configuration
│ │ ├─device
│ │ │ ├─communication
│ │ │ ├─event
│ │ │ ├─state
│ │ │ └─streaming
│ │ ├─label
│ │ ├─messages
│ │ ├─microservice
│ │ │ ├─configuration
│ │ │ │ └─model
│ │ │ ├─discovery
│ │ │ ├─groovy
│ │ │ ├─grpc
│ │ │ ├─instance
│ │ │ ├─kafka
│ │ │ ├─multitenant
│ │ │ ├─scripting
│ │ │ ├─security
│ │ │ ├─spring
│ │ │ └─state
│ │ ├─monitoring
│ │ ├─resource
│ │ │ └─request
│ │ ├─scheduling
│ │ ├─search
│ │ ├─security
│ │ ├─server
│ │ │ └─lifecycle
│ │ ├─tenant
│ │ ├─tracing
│ │ └─user
│ └─resources
├─sitewhere-core-lifecycle
│ └─src
│ └─main
│ └─java
│ └─com
│ └─sitewhere
│ └─server
│ └─lifecycle
│ └─parameters
├─sitewhere-grpc-client
│ └─src
│ └─main
│ ├─java
│ │ └─com
│ │ └─sitewhere
│ │ └─grpc
│ │ └─client
│ │ ├─asset
│ │ ├─batch
│ │ ├─cache
│ │ ├─common
│ │ │ ├─converter
│ │ │ ├─marshaler
│ │ │ ├─security
│ │ │ └─tracing
│ │ ├─device
│ │ ├─devicestate
│ │ ├─event
│ │ ├─label
│ │ ├─microservice
│ │ ├─schedule
│ │ ├─spi
│ │ │ ├─cache
│ │ │ ├─client
│ │ │ ├─multitenant
│ │ │ ├─provider
│ │ │ └─server
│ │ ├─stream
│ │ ├─tenant
│ │ └─user
│ └─resources
├─sitewhere-influxdb
│ └─src
│ └─main
│ └─java
│ └─com
│ └─sitewhere
│ └─influxdb
├─sitewhere-jdk
├─sitewhere-microservice
│ └─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─sitewhere
│ │ │ └─microservice
│ │ │ ├─configuration
│ │ │ ├─discovery
│ │ │ │ └─consul
│ │ │ ├─groovy
│ │ │ ├─grpc
│ │ │ ├─instance
│ │ │ ├─kafka
│ │ │ ├─management
│ │ │ ├─multitenant
│ │ │ │ └─operations
│ │ │ ├─operations
│ │ │ ├─scripting
│ │ │ ├─security
│ │ │ ├─spring
│ │ │ ├─state
│ │ │ └─zookeeper
│ │ └─resources
│ │ └─META-INF
│ └─test
│ └─java
│ └─com
│ └─sitewhere
│ └─microservice
│ └─security
├─sitewhere-mongodb
│ └─src
│ └─main
│ ├─java
│ │ └─com
│ │ └─sitewhere
│ │ └─mongodb
│ │ └─common
│ └─test
│ └─com
│ └─sitewhere
│ └─mongodb
│ └─test
├─sitewhere-solr
│ └─src
│ └─main
│ └─java
│ └─com
│ └─sitewhere
│ └─solr
└─sitewhere-spark
└─src
└─main
└─java
└─com
└─sitewhere
└─spark