【问题标题】:Is it possible to include AngularJs to a project with Gradle是否可以将 AngularJs 包含到带有 Gradle 的项目中
【发布时间】:2015-04-29 13:33:08
【问题描述】:

我知道可以将 AngularJs 与 Maven 一起包含到 Spring 项目中,但如何将它包含在 Gradle 中?

查看 gradle 存储库,我发现没有 AngularJs 条目。也许可以使用 Gradle 从 Maven 存储库中获取它?但是如何做到这一点。

【问题讨论】:

  • 我建议你通过this入门练习。
  • 您建议的练习包括通过使用 HTML 脚本标记从 google 获取 angular。我希望 Gradle 自动将 angular 文件放入我的项目文件夹中。
  • 除了从谷歌加载(和缓存)该文件的每个人都已经在他们的缓存中;使用您的方法,他们在缓存中有n 的副本(其中n 是他们访问的angularjs 站点的数量)。
  • 此外,当 Google 修复错误时,您无需重新编译和重新部署您的网站即可获得好处。如果绝对要求您自己提供文件(例如业务否决您),那么我将开始研究 bower 和 npm。
  • 在企业生产环境中,您不希望浏览器一直与 CDN 联系。您还想控制您正在使用的角度的确切版本。所以实际上有一个很好的理由使用 Gradle 来做这件事。

标签: java angularjs spring maven gradle


【解决方案1】:

尽管在下面的讨论中证明通过 gradle 下载 angular 没有意义,但可以使用以下代码来完成:

repositories {
   ivy {
      name = 'AngularJS'
      url = 'https://code.angularjs.org/'
      layout 'pattern', {
         artifact '[revision]/[module](.[classifier]).[ext]'
      }
   }
}

configurations {
   angular
}

dependencies {
   angular group: 'angular', name: 'angular', version: '1.3.9', classifier: 'min', ext: 'js'
}

task fetch(type: Copy) {
   from configurations.angular
   into 'src/main/webapp/js'
   rename {
      'angular.js'
   }
}

【讨论】:

    【解决方案2】:

    查看webjars,我强烈推荐它。

    我刚刚在 Maven 和 Gradle 项目中使用过它。
    基本上它正是我们所需要的,大量的前端项目和框架打包在 jars 中。

    • 将此依赖项添加到您的 build.gradle 脚本中:

      compile 'org.webjars:angularjs:1.3.14'

    • 转到文档部分以获取 Spring 的快速设置指南

    • 在脚本中包含 angular.js 或 jar 中的其他模块,例如本地资源

      <script src="where-you-exposed-webjars/angular/1.3.14/angular.js"></script>

    • 或者可选地从require.js脚本中要求它

    【讨论】:

      【解决方案3】:

      可能会迟到,但请结帐https://github.com/gharia/spring-boot-angular。 这是使用资产管道的带有角度 JS 的 Spring Boot 项目。

      编辑:

      使用this gradle plugin,我们可以轻松管理客户端依赖项,无论是 npm 还是 bower 或 GIT。请参阅下面的示例 build.gradle,其中我在 clientDependencies 中包含了 Angular 的几个依赖项。

      buildscript {
          repositories {
              mavenCentral()
              mavenLocal()
              maven { url "https://repo.grails.org/grails/core" }
          }
          dependencies {
              classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.3.RELEASE")
              classpath("org.codehaus.groovy:groovy:2.4.6")
              classpath("gradle.plugin.com.boxfuse.client:flyway-release:4.0")
          }
      }
      
      plugins {
          id 'com.craigburke.client-dependencies' version '1.0.0-RC2'
      }
      
      apply plugin: 'groovy'
      apply plugin: 'java'
      apply plugin: 'eclipse'
      apply plugin: 'idea'
      apply plugin: 'spring-boot'
      apply plugin: 'war'
      
      jar {
          baseName = 'boot-demo'
          version =  '0.1.0'
      }
      
      repositories {
          mavenCentral()
          mavenLocal()
          maven { url "https://repo.grails.org/grails/core" }
          jcenter()
          maven { url "http://repo.spring.io/libs-snapshot" }
      }
      
      sourceCompatibility = 1.8
      targetCompatibility = 1.8
      
      configurations {
          providedRuntime
      }
      
      dependencies {
          compile("org.springframework.boot:spring-boot-starter-web")
          providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")
          compile("org.springframework.boot:spring-boot-starter-actuator")
          compile("org.springframework.boot:spring-boot-starter-data-jpa")
      
          compile("org.codehaus.groovy:groovy")
          testCompile("org.springframework.boot:spring-boot-starter-test")
          testCompile("junit:junit")
      }
      
      task wrapper(type: Wrapper) {
          gradleVersion = '2.3'
      }
      
      clientDependencies {
      
      
          npm {
              'angular'('1.5.x', into: 'angular') {
                  include 'angular.js'
                  include 'angular.min.js'
              }
              'angular-resource'('1.5.x', into: 'angular') {
                  include 'angular-resource.js'
                  include 'angular-resource.min.js'
              }
              'angular-mocks'('1.5.x', into: 'angular') {
                  include 'angular-mocks.js'
                  include 'angular-mocks.min.js'
              }
              'angular-route'('1.5.x', into: 'angular'){
                  include 'angular-route.js'
                  include 'angular-route.min.js'
              }
              'angular-animate'('1.5.x', into: 'angular') {
                  include 'angular-animate.js'
                  include 'angular-animate.min.js'
              }               
      
          }
      
      }
      
      assets {
        minifyJs = true
        minifyCss = true
      }
      

      有关带角度的示例 Spring Boot 项目架构的详细信息,请参阅以下博客。:

      https://ghariaonline.wordpress.com/2016/04/19/spring-boot-with-angular-using-gradle/

      【讨论】:

      • 看起来很有趣。很快就会看看这个。
      【解决方案4】:

      我有 AngularJS 2 + Spring Boot 应用程序和 Gradle。我使用 typescript(.ts 文件)和 npm(node js 包管理器)。所以我正在运行 npm install 来生成 node_modules 和 npm run tsc 来将打字稿翻译成 javascript。不过,我仍然使用一些 webjar,基本上依赖项在构建时由 npm 任务收集,并由 systemjs.config.js 文件连接

      下面是我的文件夹结构

      /src/main/java
      /src/main/resources
                         /app           - .ts files and .js translated from .ts
                         /css
                         /js            - systemjs.config.js
                         /node_modules  - generated by npm install
                         /typings       - generated by npm install
                         package.json
                         tsconfig.json
                         typings.json
      /src/main/webapp/WEB-INF/jsp      - .jsp files
      

      这是我的 build.gradle 文件并添加两个自定义任务(npmInstall 和 npmRunTsc)来运行 npm 任务

      build.gradle

      buildscript {
          repositories {
              mavenCentral()
          }
          dependencies {
              classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.5.RELEASE")
              classpath("org.flywaydb:flyway-gradle-plugin:3.2.1")
          }
      }
      
      apply plugin: 'java'
      apply plugin: 'eclipse'
      apply plugin: 'idea'
      apply plugin: 'spring-boot'
      apply plugin: 'war'
      
      war {
          baseName = 'my-angular-app'
          version =  '1.0'
          manifest {
              attributes 'Main-Class': 'com.my.Application'
          }
      }
      
      sourceCompatibility = 1.8
      targetCompatibility = 1.8
      
      repositories {
          mavenLocal()
          mavenCentral()
      }
      
      task npmInstall(type:Exec) {
          workingDir 'src/main/resources'
          commandLine 'npm', 'install'
          standardOutput = new ByteArrayOutputStream()
          ext.output = {
              return standardOutput.toString()
          }
      }
      
      task npmRunTsc(type:Exec) {
          workingDir 'src/main/resources'
          commandLine 'npm', 'run', 'tsc'
          standardOutput = new ByteArrayOutputStream()
          ext.output = {
              return standardOutput.toString()
          }
      }
      
      dependencies {
          // tag::jetty[]
          compile("org.springframework.boot:spring-boot-starter-web")
          compile("org.springframework.boot:spring-boot-starter-tomcat",
                  "org.springframework.boot:spring-boot-starter-data-jpa",
                  "org.springframework.boot:spring-boot-starter-actuator",
                  "org.springframework.boot:spring-boot-starter-security",
                  "org.springframework.boot:spring-boot-starter-batch",
                  "org.springframework.cloud:spring-cloud-starter-config:1.0.3.RELEASE",
                  "org.springframework.cloud:spring-cloud-config-client:1.0.3.RELEASE",
                  "com.google.code.gson:gson",
                  "commons-lang:commons-lang:2.6",
                  "commons-collections:commons-collections",
                  "commons-codec:commons-codec:1.10",
                  "commons-io:commons-io:2.4",
                  "com.h2database:h2",
                  "org.hibernate:hibernate-core",
                  "org.hibernate:hibernate-entitymanager",
                  "org.webjars:datatables:1.10.5",
                  "org.webjars:datatables-plugins:ca6ec50",
                  "javax.servlet:jstl",
                  "org.apache.tomcat.embed:tomcat-embed-jasper",
                  "org.quartz-scheduler:quartz:2.2.1",
                  "org.jolokia:jolokia-core",
                  "org.aspectj:aspectjweaver",
                  "org.perf4j:perf4j:0.9.16",
                  "commons-jexl:commons-jexl:1.1",
                  "cglib:cglib:3.2.1",
                  "org.flywaydb:flyway-core",
                  )
          providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")
          testCompile("junit:junit",
                      "org.springframework:spring-test",
                      "org.springframework.boot:spring-boot-starter-test",
                      "org.powermock:powermock-api-mockito:1.6.2",
                      "org.powermock:powermock-module-junit4:1.6.2",
                      )
      }
      
      task wrapper(type: Wrapper) {
          gradleVersion = '1.11'
      }
      

      当我运行 gradle 构建过程时,我运行如下

      $ gradle clean npmInstall npmRunTsc test bootRepackage
      

      我可以使用 AngularJS 教程中显示的相同 systemjs.config.js

      systemjs.config.js

      (function(global) {
        // map tells the System loader where to look for things
        var map = {
          'app':                        'app', // 'dist',
          'rxjs':                       'node_modules/rxjs',
          'angular2-in-memory-web-api': 'node_modules/angular2-in-memory-web-api',
          '@angular':                   'node_modules/@angular'
        };
        // packages tells the System loader how to load when no filename and/or no extension
        var packages = {
          'app':                        { main: 'main.js',  defaultExtension: 'js' },
          'rxjs':                       { defaultExtension: 'js' },
          'angular2-in-memory-web-api': { defaultExtension: 'js' },
        };
        var packageNames = [
          '@angular/common',
          '@angular/compiler',
          '@angular/core',
          '@angular/http',
          '@angular/platform-browser',
          '@angular/platform-browser-dynamic',
          '@angular/router',
          '@angular/router-deprecated',
          '@angular/testing',
          '@angular/upgrade',
        ];
        // add package entries for angular packages in the form '@angular/common': { main: 'index.js', defaultExtension: 'js' }
        packageNames.forEach(function(pkgName) {
          packages[pkgName] = { main: 'index.js', defaultExtension: 'js' };
        });
        var config = {
          map: map,
          packages: packages
        }
        System.config(config);
      })(this);
      

      在 .jsp 文件中,我将 systemjs.config.js 包含在 head 部分中

      <script type="text/javascript" src="node_modules/zone.js/dist/zone.js"></script>
      <script type="text/javascript" src="node_modules/reflect-metadata/Reflect.js"></script>
      <script type="text/javascript" src="node_modules/systemjs/dist/system.src.js"></script>
      <script type="text/javascript" src="js/systemjs.config.js"></script>
      

      最后,整理一下我在 Spring WebMvcConfigurerAdapter 上的上下文路径

      @Configuration
      @EnableWebMvc
      @ComponentScan(basePackages = "com.my.controller")
      public class WebConfig extends WebMvcConfigurerAdapter {
      
          @Override
          public void addResourceHandlers(ResourceHandlerRegistry registry) {
              if (!registry.hasMappingForPattern("/webjars/**")) {
                  registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
              }
              if (!registry.hasMappingForPattern("/images/**")) {
                  registry.addResourceHandler("/images/**").addResourceLocations("classpath:/images/");
              }
              if (!registry.hasMappingForPattern("/css/**")) {
                  registry.addResourceHandler("/css/**").addResourceLocations("classpath:/css/");
              }
              if (!registry.hasMappingForPattern("/js/**")) {
                  registry.addResourceHandler("/js/**").addResourceLocations("classpath:/js/");
              }
              if (!registry.hasMappingForPattern("/app/**")) {
                  registry.addResourceHandler("/app/**").addResourceLocations("classpath:/app/");
              }
              if (!registry.hasMappingForPattern("/node_modules/**")) {
                  registry.addResourceHandler("/node_modules/**").addResourceLocations("classpath:/node_modules/");
              }
          }
      
          @Bean
          public InternalResourceViewResolver internalViewResolver() {
              InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
              viewResolver.setPrefix("/WEB-INF/jsp/");
              viewResolver.setSuffix(".jsp");
              viewResolver.setOrder(1);
              return viewResolver;
          }
      }
      

      【讨论】:

      • 一点也不差。我会试试看!
      猜你喜欢
      • 2020-05-23
      • 2017-03-14
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      • 1970-01-01
      • 2015-09-23
      • 1970-01-01
      • 2018-09-16
      相关资源
      最近更新 更多