小编Joh*_*nes的帖子

Maven:使用jar-with-dependencies分发源代码

我正在使用Maven程序集插件将我的Java项目的二进制文件打包成一个胖jar(带有jar-with-dependencies描述符).这非常有效.

问题:如何在编译的类文件旁边包含项目的源文件?我试着查看Maven文档以了解如何执行此操作但找不到任何内容.

谢谢!

我的pom.xml看起来像这样:

<project>
...
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <finalName>${pom.artifactId}-${pom.version}</finalName>
                    <appendAssemblyId>false</appendAssemblyId>
                    <outputDirectory>${project.basedir}/bin/</outputDirectory>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
Run Code Online (Sandbox Code Playgroud)

java maven maven-assembly-plugin

11
推荐指数
2
解决办法
5849
查看次数

Scala for循环和迭代器

让我们假设我有一个非常大的可迭代值集合(大约100,000个字符串条目,逐个从磁盘读取),我在其笛卡尔积上做了一些事情(并将结果写回磁盘,但我不会在这里显示):

for(v1 <- values; v2 <- values) yield ((v1, v2), 1)
Run Code Online (Sandbox Code Playgroud)

我知道这只是另一种写作方式

values.flatMap(v1 => values.map(v2 => ((v1, v2), 1)))
Run Code Online (Sandbox Code Playgroud)

这显然导致每个flatMap迭代(甚至整个笛卡尔积?)的整个集合保存在内存中.如果你使用for循环读取第一个版本,这显然是不必要的.理想情况下,只应将两个条目(正在组合的条目)保存在内存中.

如果我重新制定第一个版本:

for(v1 <- values.iterator; v2 <- values.iterator) yield ((v1, v2), 1)
Run Code Online (Sandbox Code Playgroud)

内存消耗要低很多,这让我认为这个版本必须根本不同.它在第二个版本中的确有何不同?为什么Scala不会隐式使用第一个版本的迭代器?在某些情况下不使用迭代器时是否有任何加速?

谢谢!(还要感谢"lmm"谁回答了这个问题的早期版本)

iterator loops scala

11
推荐指数
2
解决办法
7609
查看次数

C++ CPU寄存器用法

在C++中,局部变量总是在堆栈上分配.堆栈是应用程序可以占用的允许内存的一部分.该内存保存在RAM中(如果没有换成磁盘).现在,C++编译器是否总是创建在堆栈中存储局部变量的汇编程序代码?

举例来说,以下简单代码:

int foo( int n ) {
   return ++n;
}
Run Code Online (Sandbox Code Playgroud)

在MIPS汇编程序代码中,这可能如下所示:

foo:
addi $v0, $a0, 1
jr $ra
Run Code Online (Sandbox Code Playgroud)

如您所见,我根本不需要使用堆栈.C++编译器会识别出来,并直接使用CPU的寄存器吗?

编辑:哇,非常感谢您几乎立即和广泛的答案!foo的功能主体当然应该是return ++n;,而不是return n++;.:)

c++ compiler-construction assembly mips cpu-registers

10
推荐指数
4
解决办法
3676
查看次数

C++中类似接口的继承

我有以下情况,图中是我班级的理论继承图:

继承图

这个想法基本上是为了

1)有两个可以在不同平台上实现的抽象基类(在我的例子中是两个不同的操作系统)

2)允许BBase向上转换为ABase,以便能够同时处理两者(例如,将两种类型的实例保存在一个列表中).

3)在ABase和BBase中实现某些常用功能.

现在,用C++表示这个的最佳方法是什么?虽然它确实支持多重继承,但我不知道这样的多级继承.问题是B继承自A和BBase,后者又从ABase继承.只需在C++中翻译这个1:1(以下代码),C++编译器(GNU)就会抱怨AB实现没有实现ABase :: foo().

class ABase
{
public:
    virtual void foo() = 0;
    void someImplementedMethod() {}
};

class BBase : public ABase
{
public:
    virtual void bar() = 0;
    void someOtherImplementedMethod() {}
};

class A : public ABase
{
public:
    A() {}
    void foo() {}
};

class B : public A, public BBase
{
public:
    B() : A() {}
    void bar() {}
};

int main()
{
    B b;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

您如何更改此继承模型以使其与C++兼容?

编辑:图中倒置的箭头并将"向下浇筑"修正为"向上浇筑".

c++ inheritance gcc abstract-class g++

6
推荐指数
1
解决办法
346
查看次数

BufferedReader:确定读取的行的字节偏移量

我正在使用 BufferedReader 逐行读取字节流(UTF-8 文本)。出于特定原因,我需要知道该行在字节流中的确切位置开始。

问题:我无法使用插入 BufferedReader 的 InputStream 的位置 - 同样 - 读取器缓冲并一次读取超过一行。

我的问题:如何确定读取的每行的精确字节偏移量?

一种明显(但不正确)的解决方案是使用 (line + "\n").getBytes("UTF-8").length。这种方法有两个问题:1)仅计算字节数,将字符串转换回字节是相当大的开销,2)换行符并不总是标记为“\n” - 它也可能是“\ r\n”等

对此还有其他解决方案吗?

编辑:到目前为止我见过的每个类似 LineReader 的类似乎都是缓冲的。有谁知道类似无缓冲的 LineReader 类吗?

java utf-8 bufferedreader

5
推荐指数
1
解决办法
1999
查看次数