首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring项目不会从命令行运行

Spring项目不会从命令行运行
EN

Stack Overflow用户
提问于 2016-06-09 20:24:24
回答 2查看 372关注 0票数 0

我一辈子都想不出如何让Spring项目在IDE之外运行。我在用Gradle。我上下搜索,包括pply插件:“应用程序”的措辞,我看到了生成的Jars,但是当我通过gradlew运行时,它会死掉,说它找不到文件。

1)我是否需要一个单独的build.gradle文件来运行它?在它试图运行之前,我不得不取出一吨其他项目的东西(必须一直用#删除)。

2)为什么它不起作用?我甚至需要一个build.gradle文件吗?如何从Spring到在命令行上以最简单的方式运行的东西?

代码语言:javascript
复制
apply plugin: 'application'
  dependencies {
    compile project(':caffeine')#
    compile libraries.guava#

    testCompile test_libraries.junit#
    testCompile test_libraries.truth#
    testCompile test_libraries.easymock#
    testCompile test_libraries.guava_testlib#
    compile group: 'org.apache.activemq', name: 'activemq-kahadb-store', version: '5.13.3'
    compile group: 'org.apache.activemq', name: 'activemq-all', version: '5.13.3'
  }

  jar.manifest {#
    name 'com.github.ben-manes.caffeine.guava'#
    instruction 'Import-Package',#
      'com.google.common.cache',#
      'com.github.benmanes.caffeine.cache',#
      'com.github.benmanes.caffeine.cache.stats'#
    instruction 'Export-Package',#
      'com.github.benmanes.caffeine.guava'#
  }#

  jar {
      baseName = 'gs-gradle'
      version =  '0.1.0'
  }

  tasks.withType(Javadoc) {
    options.addStringOption('Xdoclint:none', '-quiet')
  }
  repositories {
     mavenCentral()
  }
  test {#
    systemProperty 'guava.osgi.version', versions.guava#
    systemProperty 'caffeine.osgi.jar', 
    project(':caffeine').jar.archivePath.path#
    systemProperty 'caffeine-guava.osgi.jar',#    
    project(':guava').jar.archivePath.path#
  }#
  mainClassName = 'org.apache.activemq.store.kahadb.disk.util.DiskMark'

用剥离的 build.gradle:编辑Gradle的输出

代码语言:javascript
复制
Total time: 0.579 secs
    tareks-MacBook-Pro:distributions tarekzegar$ gradlew run --stacktrace
    :compileJava UP-TO-DATE
    :processResources UP-TO-DATE
    :classes UP-TO-DATE
    :run
    Error: Could not find or load main class org.apache.activemq.store.kahadb.disk.util.DiskMark
    :run FAILED

    FAILURE: Build failed with an exception.

    * What went wrong:
    Execution failed for task ':run'.
    > Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/Home/bin/java'' finished with non-zero exit value 

Edit2:,谢谢你的回复。我接受了disk.util.DiskBenchmark并修改了特定的文件,因为我需要添加一个缓存,因此我的文件名为DiskMark.Java。以下是我的DiskMark的前几行

代码语言:javascript
复制
    package org.apache.activemq.store.kahadb.disk.util;

    import java.io.File;
    import java.io.RandomAccessFile;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.Random;
    import java.util.Iterator;

    import com.github.benmanes.caffeine.cache.Caffeine;
    import com.github.benmanes.caffeine.cache.RemovalCause;
    import com.github.benmanes.caffeine.cache.RemovalListener;
    import com.github.benmanes.caffeine.guava.CaffeinatedGuava;
    import com.google.common.cache.Cache;

    import org.apache.activemq.util.RecoverableRandomAccessFile;

    /**
     * This class is used to get a benchmark the raw disk performance.
     */
    public class DiskMark {

    private static final boolean SKIP_METADATA_UPDATE =
    Boolean.getBoolean("org.apache.activemq.file.skipMetadataUpdate");

    boolean verbose;
    // reads and writes work with 4k of data at a time.
   int bs = 1024 * 4;
   // Work with 100 meg file.
   long size = 1024 * 1024 * 500;
   long sampleInterval = 10 * 1000;
   static Cache<Long, byte[]> cache;
   static Callable<byte[]> loader;
   static ArrayList<Long> longIndexList; 
   boolean enableCache = true; 

   public static void main(String[] args) {

我应该以不同的方式对待这件事吗?它在IDE中运行良好

编辑3: I将java文件移动到src/main/java下的一个新包中,包名为DiskCharacterize,类名为DiskMark。仍然不工作,不起作用。

--我用这个build.gradle建造了它

代码语言:javascript
复制
  /**
   * Guava compatibility adapter.
   *
   * The tests are forked from Guava commit e370dde.
   */
  apply plugin: 'application'
  dependencies {
    compile project(':caffeine')
    compile libraries.guava

    testCompile test_libraries.junit
    testCompile test_libraries.truth
    testCompile test_libraries.easymock
    testCompile test_libraries.guava_testlib
    compile group: 'org.apache.activemq', name: 'activemq-kahadb-store', version: '5.13.3'
    compile group: 'org.apache.activemq', name: 'activemq-all', version: '5.13.3'
  }

  jar.manifest {
    name 'com.github.ben-manes.caffeine.guava'
    instruction 'Import-Package',
      'com.google.common.cache',
      'com.github.benmanes.caffeine.cache',
      'com.github.benmanes.caffeine.cache.stats'
    instruction 'Export-Package',
      'com.github.benmanes.caffeine.guava'
  }


  jar {
      baseName = 'gs-gradle'
      version =  '0.1.0'
  }

  tasks.withType(Javadoc) {
    options.addStringOption('Xdoclint:none', '-quiet')
  }
  repositories {
     mavenCentral()
  }
  test {
    systemProperty 'guava.osgi.version', versions.guava
    systemProperty 'caffeine.osgi.jar', project(':caffeine').jar.archivePath.path
    systemProperty 'caffeine-guava.osgi.jar', project(':guava').jar.archivePath.path
  }
  mainClassName = 'DiskCharacterize.DiskMark'

我切换到gradle 0.1.0.jar存在的/build/libs/目录。我用这个build.gradle填充这个dir

代码语言:javascript
复制
  /**
   * Guava compatibility adapter.
   *
   * The tests are forked from Guava commit e370dde.
   */
  apply plugin: 'application'
  /*dependencies {
    compile project(':caffeine')
    compile libraries.guava

    testCompile test_libraries.junit
    testCompile test_libraries.truth
    testCompile test_libraries.easymock
    testCompile test_libraries.guava_testlib
    compile group: 'org.apache.activemq', name: 'activemq-kahadb-store', version: '5.13.3'
    compile group: 'org.apache.activemq', name: 'activemq-all', version: '5.13.3'
  }

  jar.manifest {
    name 'com.github.ben-manes.caffeine.guava'
    instruction 'Import-Package',
      'com.google.common.cache',
      'com.github.benmanes.caffeine.cache',
      'com.github.benmanes.caffeine.cache.stats'
    instruction 'Export-Package',
      'com.github.benmanes.caffeine.guava'
  }*/

  jar {
      baseName = 'gs-gradle'
      version =  '0.1.0'
  }

  tasks.withType(Javadoc) {
    options.addStringOption('Xdoclint:none', '-quiet')
  }
  repositories {
     mavenCentral()
  }
  /*test {
    systemProperty 'guava.osgi.version', versions.guava
    systemProperty 'caffeine.osgi.jar', project(':caffeine').jar.archivePath.path
    systemProperty 'caffeine-guava.osgi.jar', project(':guava').jar.archivePath.path
  }*/
  mainClassName = 'DiskCharacterize.DiskMark'

--失败了

代码语言:javascript
复制
    xxxxxx$ gradlew run
    :compileJava UP-TO-DATE
    :processResources UP-TO-DATE
    :classes UP-TO-DATE
    :run
    Error: Could not find or load main class DiskCharacterize.DiskMark
    :run FAILED

    FAILURE: Build failed with an exception.

    * What went wrong:
    Execution failed for task ':run'.
    > Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/Home/bin/java'' finished with non-zero exit value 1

怎么一回事?我需要它跑,但我的生命无法弄清楚

EDIT4: gradle运行不起作用,即使使用apply插件:'java‘添加了,插件应用程序还是隐式地调用了java插件。

不过,我让它跑了。我转到../build/distributions/文件夹,其中包含番石榴-2.3.1-SNAPSHOT.tar和番石榴-2.3.1-SNAPSHOT.zip,我解压缩了zip文件,找到了bash文件并简单地执行了它;程序运行。为什么gradle运行不工作,我不知道(我仍然很想了解,如果你有任何想法)。谢谢你们的帮助,谢谢你们,本·M。

EN

回答 2

Stack Overflow用户

发布于 2016-06-09 20:51:27

根据新信息编辑的答案:

基于分级应用程序插件文档,run命令运行在“主源集”上。您要运行的类在src/test下,它不是Gradle默认源位置的一部分(如果是的话,根据名称,它将是测试源位置的一部分)。请查看分级Java插件文档(45.2),以获得更好的描述,说明源集是什么以及如何修改它们,而不是我在这里所能提供的:)

简短的回答/建议:将包和文件从src/test中移到一个名为src/main/java的源文件夹中,以允许Gradle运行以找到它希望找到的类(您也可以重新配置源集,但这对您的情况来说似乎太过了)

旧的答案(基于对试图使用图书馆提供的类的台风的错误评估):

我假设您正在尝试将类org.apache.activemq.store.kahadb.disk.util.DiskMark作为您的主类运行。根据类的名称,我猜您正在尝试使用build.gradle文件中的activemq-kahadb依赖项(而不是使用与activemq-kahadb结构几乎相同的包结构编写它)。 对于您所依赖的版本,似乎不存在具有该名称的类(基于包装树)。我没有找到任何具有这个名称的类的ActiveMQ版本。有一个名为org.apache.activemq.store.kahadb.disk.util.DiskBenchmark的类,它包含一个main方法--这是您想要调用的吗?

票数 0
EN

Stack Overflow用户

发布于 2016-06-10 16:09:27

查看您已经运行的DiskMark源代码和正在获得的错误消息,DiskMark类的完全限定名(即包名+类名)是:org.apache.activemq.store.kahadb.disk.util.DiskMark,而不是DiskCharacterize.DiskMark。因此,无法找到该类。

有两种解决办法:

解决方案1:告诉gradle寻找正确的类:

代码语言:javascript
复制
mainClassName = 'org.apache.activemq.store.kahadb.disk.util.DiskMark'

此外,作为项目组织的一个问题,项目中每个文件的存储位置应该与类的包匹配。在DiskMark的例子中,路径应该是:

%ProjectRoot%/src/main/java/org/apache/activemq/store/kahadb/disk/util/DiskMark.java

解决方案2:更改类的打包(以及任何需要匹配的内容)

代码语言:javascript
复制
package DiskCharacterize;
//...
public class DiskMark {
    //...
}

文件位置:

代码语言:javascript
复制
%projectRoot%/src/main/java/DiskCharacterize/DiskMark.java

这个解决方案是有效的,但是您当前的包DiskCharacterize并不遵循java风格的约定(对于那些不熟悉代码的人来说,DiskMark看起来就像是一个内部类)。

因此,我强烈建议将这两种解决方案结合起来,并更改包名以使用全小写包名。org.tarek.diskcharacterize将是您的包的一个非常合适的名称。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37735483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档